基于PHP后臺的Android新聞瀏覽客戶端
本文實例為大家分享了Android新聞瀏覽客戶端,基于php后臺,供大家參考,具體內(nèi)容如下
1、使用HBuilder進行PHP環(huán)境配置,測試是否可以查詢MySQL語句,之前都已經(jīng)詳細說明過了。
2、此處php后臺實現(xiàn)mysql的查詢功能,并以JSON數(shù)據(jù)格式返回個客戶端
在PHP此處建立一個mysql_connect.php文件,實現(xiàn)數(shù)據(jù)庫的連接,并設置字符集格式。
<?php $con = mysql_connect("localhost","root","123456"); //設置字符集為UTF-8 可解決中文亂碼 mysql_query("SET NAMES 'utf8'"); mysql_query("SET CHARACTER SET utf8"); mysql_query("SET CHARACTER_SET_RESULT=utf8"); if(!$con){ die(mysql_error()); } mysql_select_db("newsdemo",$con); ?>
然后新建一個getNewsJSON.php文件用于進行將查詢結果轉(zhuǎn)換成JSON字符串格式。只需要 json_encode這個方法即可。
<?php /*獲得JSON數(shù)據(jù) * 返回值:title desc time content_url pic_url*/ require 'mysql_connect.php'; $n = 0; $result = mysql_query("select * from news"); while($row = mysql_fetch_array($result)){ $arr[$n++] = array( "title"=>$row['title'], "desc"=>$row['desc'], "time"=>$row['time'], "content_url"=>$row['content_url'], "pic_url"=>$row['pic_url'] ); } //數(shù)組轉(zhuǎn)化為JSON字符串 echo json_encode($arr); ?>
重點在于Android端的設計開發(fā)
1、設計界面
由于需要以在ListView的每個Item中設置相同的格式,所以此處運用ListView+Adapter的形式
在主界面LinearLayout中添加一個ListView控件
2、Mainactivity程序如下:
public class MainActivity extends Activity implements OnItemClickListener{ private ListView lvNews ; private NewsAdapter adapter ; //定義集合 private List<News> newsList ; //獲取json字符串的URL地址 public static final String GET_NEWS_URL = "http://211.87.234.20/NewsDemo/getNewsJSON.php"; //獲取msg之后如何處理 private Handler getNewsHandler = new Handler(){ public void handleMessage(android.os.Message msg){ String jsonData = (String) msg.obj ; System.out.println(jsonData) ; try { JSONArray jsonArray = new JSONArray(jsonData) ; for(int i=0;i<jsonArray.length();i++){ JSONObject object = jsonArray.getJSONObject(i) ; String title = object.getString("title") ; String desc = object.getString("desc") ; String time = object.getString("time") ; String content_url = object.getString("content_url") ; String pic_url = object.getString("pic_url") ; System.out.println("title="+title) ; //add一個News類型的Object newsList.add(new News(title,desc,time,content_url,pic_url)) ; } //通知更新 adapter.notifyDataSetChanged() ; } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } ; } ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) ; setContentView(R.layout.activity_main) ; lvNews = (ListView) findViewById(R.id.lvNews) ; //初始化 newsList = new ArrayList<News>(); adapter = new NewsAdapter(this,newsList) ; lvNews.setAdapter(adapter) ; lvNews.setOnItemClickListener(this) ; HttpUtils.getNewsJSON(GET_NEWS_URL,getNewsHandler) ; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { // TODO Auto-generated method stub News news = newsList.get(position) ; Intent intent = new Intent(this,BrowseNewsActivity.class) ; intent.putExtra("content_url",news.getContent_url()) ; startActivity(intent) ; } }
此處需要一個工具類HttpUtils以及自定義的NewsAdapter以實現(xiàn)item的視圖顯示.
HttpUtils代碼如下:
package com.MR.news.utils; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Handler; import android.os.Message; import android.widget.ImageView; public class HttpUtils { //工具類直接定義成靜態(tài)方法即可 /*url用于內(nèi)部類中,所以要將其設定為final類型*/ /*讀取完成需要通知主線程,需要使用handler*/ public static void getNewsJSON(final String url,final Handler handler){ //訪問網(wǎng)絡,時間長,開啟新線程 new Thread(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub HttpURLConnection conn ; InputStream is ; try { conn = (HttpURLConnection) new URL(url).openConnection() ; //GET方式獲取 conn.setRequestMethod("GET") ; //得到輸入流 is=conn.getInputStream() ; //讀取數(shù)據(jù)用緩沖,里面要傳入一個reader BufferedReader reader = new BufferedReader(new InputStreamReader(is)); //一行一行讀取數(shù)據(jù) String line = ""; //沒讀完一行進行拼接,高效 StringBuilder result = new StringBuilder(); while((line = reader.readLine()) != null){ result.append(line); } Message msg = new Message() ; //msg.obj可以放進去任何對象 msg.obj = result.toString() ; handler.sendMessage(msg) ; } catch (Exception e) { e.printStackTrace(); } }}).start() ; } public static void setPicBitMap(final ImageView ivPic,final String pic_url){ new Thread(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub try { HttpURLConnection conn = (HttpURLConnection) new URL(pic_url).openConnection() ; conn.connect() ; InputStream is = conn.getInputStream() ; //bitmap就是所需圖片資源 /*從資源文件中的到圖片*/ Bitmap bitmap = BitmapFactory.decodeStream(is) ; ivPic.setImageBitmap(bitmap) ; is.close() ; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start() ; } }
NewsAdapter代碼如下:
package com.MR.news.adapter; import java.util.List; import com.MR.news.R; import com.MR.news.model.News; import com.MR.news.utils.HttpUtils; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class NewsAdapter extends BaseAdapter { //聲明上下文對象,后面的getView方法需要 private Context context; private List<News> newsList; public NewsAdapter(Context context, List<News> newsList){ this.context = context ; this.newsList = newsList ; } @Override public int getCount() { // TODO Auto-generated method stub return newsList.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return newsList.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup arg2) { // TODO Auto-generated method stub if(convertView == null){ convertView = LayoutInflater.from(context).inflate(R.layout.news_item,null) ; } TextView tvTitle = (TextView) convertView.findViewById(R.id.tvTitle) ; TextView tvDesc = (TextView) convertView.findViewById(R.id.tvDesc) ; TextView tvTime = (TextView) convertView.findViewById(R.id.tvTime) ; ImageView ivPic = (ImageView) convertView.findViewById(R.id.ivPic); News news = newsList.get(position) ; tvTitle.setText(news.getTitle()) ; tvDesc.setText(news.getDesc()) ; tvTime.setText(news.getTime()) ; String pic_url = news.getPic_url() ; HttpUtils.setPicBitMap(ivPic, pic_url) ; return convertView; } }
news_item用來設置每個item的顯示格式
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/ivPic" android:layout_width="42dp" android:layout_height="42dp" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/tvTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_toRightOf="@+id/ivPic" android:text="title" android:textSize="18sp" /> <TextView android:id="@+id/tvDesc" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/tvTitle" android:layout_below="@+id/tvTitle" android:text="desc" android:textSize="18sp" /> <TextView android:id="@+id/tvTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:text="time" android:textSize="10sp" /> </RelativeLayout>
注意:此item中需要顯示單個圖片,所以用到Bitmap這個類。由于用到網(wǎng)絡傳輸,所以需要用到線程這個概念!!
關鍵理解handler message以及l(fā)oop這三者的關系。
以上就是本文的全部內(nèi)容,希望對大家學習Android軟件編程有所幫助。
- Android App端與PHP Web端的簡單數(shù)據(jù)交互實現(xiàn)示例
- Android md5加密與php md5加密一致詳解
- Android上傳文件到Web服務器 PHP接收文件
- Android通過PHP服務器實現(xiàn)登錄功能
- PHP簡單判斷iPhone、iPad、Android及PC設備的方法
- php、java、android、ios通用的3des方法(推薦)
- php生成Android客戶端掃描可登錄的二維碼
- Android異步上傳圖片到PHP服務器
- 使用PHP開發(fā)Android應用程序技術介紹
- Android訪問php取回json數(shù)據(jù)實例
- android+json+php+mysql實現(xiàn)用戶反饋功能方法解析
- Android和PHP MYSQL交互開發(fā)實例
相關文章
PHP 面向?qū)ο蟪绦蛟O計(oop)學習筆記 (二) - 靜態(tài)變量的屬性和方法及延遲綁定
靜態(tài)變量的類型關鍵字是static。本文主要是學習php中靜態(tài)屬性和靜態(tài)方法的使用方法和基本的示例以及延遲綁定2014-06-06gd庫圖片下載類實現(xiàn)下載網(wǎng)頁所有圖片的php代碼
在前期的php教程就講了php gd庫可以實現(xiàn)遠程圖片的下載,但是那只是下載了一張圖片,原理是一樣的,要想下載一個網(wǎng)頁的所有圖片只要使用正則表達式進行判斷,找出所有的圖片url就可以進行循環(huán)下載了,我特地參照網(wǎng)絡資源編寫了gd庫圖片下載類!2012-08-08Laravel 中使用 Vue.js 實現(xiàn)基于 Ajax 的表單提交錯誤驗證操作
這篇文章主要介紹了Laravel 中使用 Vue.js 實現(xiàn)基于 Ajax 的表單提交錯誤驗證功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-06-06PHP中設置一個嚴格30分鐘過期Session面試題的4種答案
這篇文章主要介紹了PHP中設置一個嚴格30分鐘過期Session面試題的4種答案,需要的朋友可以參考下2014-07-07php 使用curl模擬登錄人人(校內(nèi))網(wǎng)的簡單實例
下面小編就為大家?guī)硪黄猵hp 使用curl模擬登錄人人(校內(nèi))網(wǎng)的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06