欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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