基于PHP后台的Android新闻浏览客户端


Posted in PHP onMay 23, 2016

本文实例为大家分享了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 相关文章推荐
php 来访国内外IP判断代码并实现页面跳转
Dec 18 PHP
PHP查询MySQL大量数据的时候内存占用分析
Jul 22 PHP
php实现快速排序法函数代码
Aug 27 PHP
php curl 伪造IP来源的实例代码
Nov 01 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
Jan 22 PHP
php对关联数组循环遍历的实现方法
Mar 13 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
May 17 PHP
php文件系统处理方法小结
May 23 PHP
thinkPHP5.0框架安装教程
Mar 25 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
Apr 21 PHP
php session_decode函数用法讲解
May 26 PHP
PHP+Mysql分布式事务与解决方案深入理解
Feb 27 PHP
Smarty保留变量用法分析
May 23 #PHP
php parse_str() 函数的定义和用法
May 23 #PHP
Smarty简单生成表单元素的方法示例
May 23 #PHP
深入剖析PHP中printf()函数格式化使用
May 23 #PHP
深入理解php printf() 输出格式化的字符串
May 23 #PHP
PHP书写格式详解(必看)
May 23 #PHP
Smarty模板简单配置与使用方法示例
May 23 #PHP
You might like
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
2013/08/07 PHP
微信支付开发动态链接Native支付
2016/07/12 PHP
tp5 sum某个字段相加得到总数的例子
2019/10/18 PHP
js每次Title显示不同的名言
2008/09/25 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
深入理解JavaScript编程中的同步与异步机制
2015/06/24 Javascript
js插件dropload上拉下滑加载数据实例解析
2016/07/27 Javascript
Vue应用部署到服务器的正确方式
2017/07/15 Javascript
vue的过滤器filter实例详解
2018/09/17 Javascript
Vue项目利用axios请求接口下载excel
2020/11/17 Vue.js
[55:25]2018DOTA2亚洲邀请赛3月29日 小组赛A组 VG VS OG
2018/03/30 DOTA
[56:17]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
用python写asp详细讲解
2013/12/16 Python
Python配置文件解析模块ConfigParser使用实例
2015/04/13 Python
Python NumPy库安装使用笔记
2015/05/18 Python
Python+Wordpress制作小说站
2017/04/14 Python
Python生成器定义与简单用法实例分析
2018/04/30 Python
python pandas 对时间序列文件处理的实例
2018/06/22 Python
python分批定量读取文件内容,输出到不同文件中的方法
2018/12/08 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
使用Python在Windows下获取USB PID&amp;VID的方法
2019/07/02 Python
Django Rest framework频率原理与限制
2019/07/26 Python
python pillow模块使用方法详解
2019/08/30 Python
python将字典列表导出为Excel文件的方法
2019/09/02 Python
Pandas聚合运算和分组运算的实现示例
2019/10/17 Python
基于python计算并显示日间、星期客流高峰
2020/05/07 Python
python怎么判断模块安装完成
2020/06/19 Python
对python中list的五种查找方法说明
2020/07/13 Python
html5 Canvas绘制线条 closePath()实例代码
2012/05/10 HTML / CSS
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
升职自荐信范文
2013/10/05 职场文书
历史系自荐信范文
2013/12/24 职场文书
母亲节感恩寄语
2014/02/21 职场文书
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
德育标兵事迹材料
2014/08/24 职场文书
2014年学校卫生工作总结
2014/11/20 职场文书