基于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软件编程有所帮助。