基于PHP后台的Android新闻浏览客户端

5年以前  |  阅读数:544 次  |  编程语言:PHP 

本文实例为大家分享了Android新闻浏览客户端,基于php后台,供大家参考,具体内容如下

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类型的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以实现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(){



    @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() ;

    //读取数据用缓冲,里面要传入一个reader

    BufferedReader 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(){



    @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这个类。由于用到网络传输,所以需要用到线程这个概念!!

关键理解handler message以及loop这三者的关系。

以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
文件下载
贪吃蛇
获取IMEI
双位运算符
发送邮件
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
提取后缀名
年的日历图
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例