基于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("SETNAMES'utf8'");
mysql_query("SETCHARACTERSETutf8");
mysql_query("SETCHARACTER_SET_RESULT=utf8");
if(!$con){
die(mysql_error());
}
mysql_select_db("newsdemo",$con);
?>
然后新建一个getNewsJSON.php文件用于进行将查询结果转换成JSON字符串格式。只需要json_encode这个方法即可。
<?php
/*获得JSON数据
*返回值:titledesctimecontent_urlpic_url*/
require'mysql_connect.php';
$n=0;
$result=mysql_query("select*fromnews");
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字符串
echojson_encode($arr);
?>
重点在于Android端的设计开发
1、设计界面
由于需要以在ListView的每个Item中设置相同的格式,所以此处运用ListView+Adapter的形式
在主界面LinearLayout中添加一个ListView控件
2、Mainactivity程序如下:
publicclassMainActivityextendsActivityimplementsOnItemClickListener{
privateListViewlvNews;
privateNewsAdapteradapter;
//定义集合
privateList<News>newsList;
//获取json字符串的URL地址
publicstaticfinalStringGET_NEWS_URL="http://211.87.234.20/NewsDemo/getNewsJSON.php";
//获取msg之后如何处理
privateHandlergetNewsHandler=newHandler(){
publicvoidhandleMessage(android.os.Messagemsg){
StringjsonData=(String)msg.obj;
System.out.println(jsonData);
try{
JSONArrayjsonArray=newJSONArray(jsonData);
for(inti=0;i<jsonArray.length();i++){
JSONObjectobject=jsonArray.getJSONObject(i);
Stringtitle=object.getString("title");
Stringdesc=object.getString("desc");
Stringtime=object.getString("time");
Stringcontent_url=object.getString("content_url");
Stringpic_url=object.getString("pic_url");
System.out.println("title="+title);
//add一个News类型的Object
newsList.add(newNews(title,desc,time,content_url,pic_url));
}
//通知更新
adapter.notifyDataSetChanged();
}catch(JSONExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
};
};
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lvNews=(ListView)findViewById(R.id.lvNews);
//初始化
newsList=newArrayList<News>();
adapter=newNewsAdapter(this,newsList);
lvNews.setAdapter(adapter);
lvNews.setOnItemClickListener(this);
HttpUtils.getNewsJSON(GET_NEWS_URL,getNewsHandler);
}
@Override
publicbooleanonCreateOptionsMenu(Menumenu){
//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
getMenuInflater().inflate(R.menu.main,menu);
returntrue;
}
@Override
publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intposition,longarg3){
//TODOAuto-generatedmethodstub
Newsnews=newsList.get(position);
Intentintent=newIntent(this,BrowseNewsActivity.class);
intent.putExtra("content_url",news.getContent_url());
startActivity(intent);
}
}
此处需要一个工具类HttpUtils以及自定义的NewsAdapter以实现item的视图显示.
HttpUtils代码如下:
packagecom.MR.news.utils;
importjava.io.BufferedReader;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.net.HttpURLConnection;
importjava.net.URL;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.widget.ImageView;
publicclassHttpUtils{
//工具类直接定义成静态方法即可
/*url用于内部类中,所以要将其设定为final类型*/
/*读取完成需要通知主线程,需要使用handler*/
publicstaticvoidgetNewsJSON(finalStringurl,finalHandlerhandler){
//访问网络,时间长,开启新线程
newThread(newRunnable(){
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
HttpURLConnectionconn;
InputStreamis;
try{
conn=(HttpURLConnection)newURL(url).openConnection();
//GET方式获取
conn.setRequestMethod("GET");
//得到输入流
is=conn.getInputStream();
//读取数据用缓冲,里面要传入一个reader
BufferedReaderreader=newBufferedReader(newInputStreamReader(is));
//一行一行读取数据
Stringline="";
//没读完一行进行拼接,高效
StringBuilderresult=newStringBuilder();
while((line=reader.readLine())!=null){
result.append(line);
}
Messagemsg=newMessage();
//msg.obj可以放进去任何对象
msg.obj=result.toString();
handler.sendMessage(msg);
}catch(Exceptione){
e.printStackTrace();
}
}}).start();
}
publicstaticvoidsetPicBitMap(finalImageViewivPic,finalStringpic_url){
newThread(newRunnable(){
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
try{
HttpURLConnectionconn=(HttpURLConnection)newURL(pic_url).openConnection();
conn.connect();
InputStreamis=conn.getInputStream();
//bitmap就是所需图片资源
/*从资源文件中的到图片*/
Bitmapbitmap=BitmapFactory.decodeStream(is);
ivPic.setImageBitmap(bitmap);
is.close();
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}).start();
}
}
NewsAdapter代码如下:
packagecom.MR.news.adapter;
importjava.util.List;
importcom.MR.news.R;
importcom.MR.news.model.News;
importcom.MR.news.utils.HttpUtils;
importandroid.content.Context;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.BaseAdapter;
importandroid.widget.ImageView;
importandroid.widget.TextView;
publicclassNewsAdapterextendsBaseAdapter{
//声明上下文对象,后面的getView方法需要
privateContextcontext;
privateList<News>newsList;
publicNewsAdapter(Contextcontext,List<News>newsList){
this.context=context;
this.newsList=newsList;
}
@Override
publicintgetCount(){
//TODOAuto-generatedmethodstub
returnnewsList.size();
}
@Override
publicObjectgetItem(intposition){
//TODOAuto-generatedmethodstub
returnnewsList.get(position);
}
@Override
publiclonggetItemId(intposition){
//TODOAuto-generatedmethodstub
returnposition;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGrouparg2){
//TODOAuto-generatedmethodstub
if(convertView==null){
convertView=LayoutInflater.from(context).inflate(R.layout.news_item,null);
}
TextViewtvTitle=(TextView)convertView.findViewById(R.id.tvTitle);
TextViewtvDesc=(TextView)convertView.findViewById(R.id.tvDesc);
TextViewtvTime=(TextView)convertView.findViewById(R.id.tvTime);
ImageViewivPic=(ImageView)convertView.findViewById(R.id.ivPic);
Newsnews=newsList.get(position);
tvTitle.setText(news.getTitle());
tvDesc.setText(news.getDesc());
tvTime.setText(news.getTime());
Stringpic_url=news.getPic_url();
HttpUtils.setPicBitMap(ivPic,pic_url);
returnconvertView;
}
}
news_item用来设置每个item的显示格式
<?xmlversion="1.0"encoding="utf-8"?> <RelativeLayoutxmlns: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这个类。由于用到网络传输,所以需要用到线程这个概念!!
关键理解handlermessage以及loop这三者的关系。
以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。