本文主要为大家详细介绍了基于php后台的android新闻浏览客户端,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。希望对大家有所帮助。
具体内容如下
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这三者的关系。
相关推荐:
php api获取天气预报,以及使用飞信api,给好友发_php教程
小白php api初体验 php api文档 php api接口开发 php web ap
nginx 配置ajax跨域访问php api
以上就是基于php后端实现android客户端新闻浏览的详细内容。