這篇文章主要為大家詳細介紹了基於PHP後台實現Android新聞瀏覽用戶端,具有一定的參考價值,感興趣的小夥伴們可以參考一下
1、使用HBuilder進行PHP環境配置,測試是否可以查詢MySQL語句,之前都已經詳細說明過了。
2、此處php後台實現mysql的查詢功能,並以JSON資料格式返回個用戶端
在PHP此處建立一個mysql_connect.php檔案,實現資料庫的串連,並設定字元集格式。
<?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檔案用於進行將查詢結果轉換成JSON字串格式。只需要 json_encode這個方法即可。
<?php/*獲得JSON資料 * 傳回值: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']);}//數組轉化為JSON字串echo json_encode($arr);?>
重點在於Android端的設計開發
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類型的ObjectnewsList.add(new News(title,desc,time,content_url,pic_url)) ;}//通知更新adapter.notifyDataSetChanged() ;} catch (JSONException e) {// TODO Auto-generated catch blocke.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; }@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {// TODO Auto-generated method stubNews news = newsList.get(position) ;Intent intent = new Intent(this,BrowseNewsActivity.class) ;intent.putExtra("content_url",news.getContent_url()) ;startActivity(intent) ;} }
此處需要一個工具類HttpUtils以及自訂的NewsAdapter以實現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 {//工具類直接定義成靜態方法即可/*url用於內部類中,所以要將其設定為final類型*//*讀取完成需要通知主線程,需要使用handler*/public static void getNewsJSON(final String url,final Handler handler){//訪問網路,時間長,開啟新線程new Thread(new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stubHttpURLConnection conn ;InputStream is ;try {conn = (HttpURLConnection) new URL(url).openConnection() ;//GET方式擷取conn.setRequestMethod("GET") ;//得到輸入資料流is=conn.getInputStream() ;//讀取資料用緩衝,裡面要傳入一個readerBufferedReader reader = new BufferedReader(new InputStreamReader(is));//一行一行讀取資料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(){@Overridepublic void run() {// TODO Auto-generated method stubtry {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 blocke.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 ;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn newsList.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn newsList.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup arg2) {// TODO Auto-generated method stubif(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這個類。由於用到網路傳輸,所以需要用到線程這個概念!!
關鍵理解handler message以及loop這三者的關係。
總結:以上就是本篇文的全部內容,希望能對大家的學習有所協助。