服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - PHP教程 - 基于PHP后台的Android新闻浏览客户端

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

2021-01-22 16:09xiaopihaierletian PHP教程

这篇文章主要为大家详细介绍了基于PHP后台的Android新闻浏览客户端,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android新闻浏览客户端,基于php后台,供大家参考,具体内容如下

1、使用HBuilder进行PHP环境配置,测试是否可以查询MySQL语句,之前都已经详细说明过了。

2、此处php后台实现mysql的查询功能,并以JSON数据格式返回个客户端

在PHP此处建立一个mysql_connect.php文件,实现数据库的连接,并设置字符集格式。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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这个方法即可。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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程序如下:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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 id="codetool">

此处需要一个工具类HttpUtils以及自定义的NewsAdapter以实现item的视图显示.

HttpUtils代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
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代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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的显示格式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?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软件编程有所帮助。

延伸 · 阅读

精彩推荐