基于PHP后台的Android新闻浏览客户端
来源: 阅读:919 次 日期:2016-08-19 14:43:41
温馨提示: 小编为您整理了“基于PHP后台的Android新闻浏览客户端”,方便广大网友查阅!

本文实例为大家分享了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软件编程有所帮助。

更多信息请查看网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:hfpxwx
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map