基于PHP后台的Android新闻浏览客户端
程序员文章站
2024-04-02 13:12:58
本文实例为大家分享了android新闻浏览客户端,基于php后台,供大家参考,具体内容如下
1、使用hbuilder进行php环境配置,测试是否可以查询mysql语句,之...
本文实例为大家分享了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文件系统处理方法小结
下一篇: ThinkPHP发送邮件示例代码
推荐阅读
-
基于PHP后台的Android新闻浏览客户端
-
基于PHP后台的Android新闻浏览客户端
-
基于PHP后台的Android新闻浏览客户端,php后台android新闻
-
如何选择 Android 客户端的后台服务器,是 PHP 还是 Java web?有没有好的教程呢?
-
基于PHP后端实现Android客户端新闻浏览
-
基于PHP后台的Android新闻浏览客户端,php后台android新闻_PHP教程
-
php获得客户端浏览器名称及版本的方法(基于ECShop函数),
-
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
-
php获得客户端浏览器名称及版本的方法(基于ECShop函数),
-
android - 安卓后台如何接收安卓客户端发送到php写的后台的数据 get post