基于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读取目录下所有文件的代码
Jan 07 PHP
php面向对象全攻略 (四)构造方法与析构方法
Sep 30 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
Jul 03 PHP
php中利用str_pad函数生成数字递增形式的产品编号
Sep 30 PHP
php命令行使用方法和命令行参数说明
Apr 08 PHP
php实现redis数据库指定库号迁移的方法
Jan 14 PHP
php pdo操作数据库示例
Mar 10 PHP
php实现简单的权限管理的示例代码
Aug 25 PHP
PHP getDocNamespaces()函数讲解
Feb 03 PHP
微信公众平台开发教程⑤ 微信扫码支付模式介绍
Apr 10 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
Apr 30 PHP
php屏蔽错误及提示的方法
May 10 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判断远程图片或文件是否存在的实现代码
2014/02/20 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
Jquery调用webService远程访问出错的解决方法
2010/05/21 Javascript
jquery快捷动态绑定键盘事件的操作函数代码
2013/10/17 Javascript
js数值和和字符串进行转换时可以对不同进制进行操作
2014/03/05 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
2020/09/12 Javascript
jQuery实现的导航条切换可显示隐藏
2014/10/22 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
使用three.js 画渐变的直线
2016/06/05 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
第一个Vue插件从封装到发布
2017/11/22 Javascript
Vue 事件处理操作实例详解
2019/03/05 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
2020/10/30 Javascript
[01:47]2018年度DOTA2最具人气解说-完美盛典
2018/12/16 DOTA
Python基于smtplib实现异步发送邮件服务
2015/05/28 Python
结合Python的SimpleHTTPServer源码来解析socket通信
2016/06/27 Python
Pycharm学习教程(3) 代码运行调试
2017/05/03 Python
让Django支持Sql Server作后端数据库的方法
2018/05/29 Python
Python实现爬虫从网络上下载文档的实例代码
2018/06/13 Python
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
在Python中居然可以定义两个同名通参数的函数
2019/01/31 Python
详解Python 多线程 Timer定时器/延迟执行、Event事件
2019/06/27 Python
python 将字符串中的数字相加求和的实现
2019/07/18 Python
Python aiohttp百万并发极限测试实例分析
2019/10/26 Python
Python continue语句实例用法
2020/02/06 Python
python字符串的index和find的区别详解
2020/06/20 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
2021/02/06 Python
MYSQL相比于其他数据库有哪些特点
2013/07/19 面试题
机电一体化专业应届生求职信
2013/11/27 职场文书
毕业班联欢会主持词
2014/03/27 职场文书
疾病捐款倡议书
2014/05/13 职场文书
餐饮周年庆活动方案
2014/08/14 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
2016元旦文艺汇演主持词
2015/07/06 职场文书
2016年保险公众宣传日活动总结
2016/04/05 职场文书