基于PHP后臺(tái)的Android新聞瀏覽客戶端

字號(hào):


    本文實(shí)例為大家分享了Android新聞瀏覽客戶端,基于php后臺(tái),供大家參考,具體內(nèi)容如下
    1、使用HBuilder進(jìn)行PHP環(huán)境配置,測(cè)試是否可以查詢MySQL語(yǔ)句,之前都已經(jīng)詳細(xì)說(shuō)明過(guò)了。
    2、此處php后臺(tái)實(shí)現(xiàn)mysql的查詢功能,并以JSON數(shù)據(jù)格式返回個(gè)客戶端
    在PHP此處建立一個(gè)mysql_connect.php文件,實(shí)現(xiàn)數(shù)據(jù)庫(kù)的連接,并設(shè)置字符集格式。
    <?php
    $con = mysql_connect("localhost","root","123456");
    //設(shè)置字符集為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);
    ?>
    然后新建一個(gè)getNewsJSON.php文件用于進(jìn)行將查詢結(jié)果轉(zhuǎn)換成JSON字符串格式。只需要 json_encode這個(gè)方法即可。
    <?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);
    ?>
    重點(diǎn)在于Android端的設(shè)計(jì)開(kāi)發(fā)
    1、設(shè)計(jì)界面
    由于需要以在ListView的每個(gè)Item中設(shè)置相同的格式,所以此處運(yùn)用ListView+Adapter的形式
    在主界面LinearLayout中添加一個(gè)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一個(gè)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) ;
    }
    }
    此處需要一個(gè)工具類HttpUtils以及自定義的NewsAdapter以實(shí)現(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)部類中,所以要將其設(shè)定為final類型*/
    /*讀取完成需要通知主線程,需要使用handler*/
    public static void getNewsJSON(final String url,final Handler handler){
    //訪問(wèn)網(wǎng)絡(luò),時(shí)間長(zhǎng),開(kāi)啟新線程
    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ù)用緩沖,里面要傳入一個(gè)reader
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    //一行一行讀取數(shù)據(jù)
    String line = "";
    //沒(méi)讀完一行進(jìn)行拼接,高效
    StringBuilder result = new StringBuilder();
    while((line = reader.readLine()) != null){
    result.append(line);
    }
    Message msg = new Message() ;
    //msg.obj可以放進(jìn)去任何對(duì)象
    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 {
    //聲明上下文對(duì)象,后面的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用來(lái)設(shè)置每個(gè)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中需要顯示單個(gè)圖片,所以用到Bitmap這個(gè)類。由于用到網(wǎng)絡(luò)傳輸,所以需要用到線程這個(gè)概念??!
    關(guān)鍵理解handler message以及l(fā)oop這三者的關(guān)系。
    以上就是本文的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)Android軟件編程有所幫助。