前面一篇说完来页面布局,总得来说页面在adapter中设置布局,ListView.setAdapter(Adapter)来加载视图样子。接下来就看看网络通信这一部分
新建一个网络通信类HttpUtils,在里面写网络请求和处理
首先定义一个getNewsJson方法,实现从数据库读取数据并得到的JSON数据。新开一个线程来处理,因为不能在主线程处理网络请求,因为一旦请求时间长一点有可能就导致主线程卡死了,停止运行,所以要新开线程,这一点在线程那也说过。网络通信 我们使用HTTP来访问网络,HttpURLConnection继承URLConnection操作Http方便快捷
具体步骤:
1.创建URL对象,并且通过url.openConnection()来连接网络
2.设置请求方式为GET,POST用于数据提交
3.返回HttpURLConnection对应的输入流,获取响应内容
这里用到的是getInputStream(),对应的getOutputStream()是返回输出流,用于向HttpURLConnection发送请求参数
4.定义BufferedReader输入流读取URL响应
5.定义StringBuilder来将读取结果添加在一起形成String
6.用handler.sendMessage()将响应内容发给主线程 ,通知主线程更新
前面也提到了,像时间啊标题之类的都可以直接从数据库获取,但是图片需要网络请求,所以我们在网络请求类中需要加上图片的处理
我们写一个setBitmap()方法,来实现从网络链接中获取图片并显示
前面步骤相同,值得说的是BitmapFactory是一个工具类,有大量可以从不同数据源解析创建Bitmap对象,其中decodeStream(InputStream is)用于从指定输入流解析创建Bitmap对象
package com.news;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.ImageView;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* Created by Administrator on 2016-08-25.
*/
public class HttpUtils {
public static void getNewsJson(final String url,final Handler handler){
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection conn;
InputStream is;
try {
conn = (HttpURLConnection) new URL(url).openConnection(); //打开网络连接
conn.setRequestMethod("GET"); //设置发送请求方式是GET
is = conn.getInputStream(); // 返回对应输入流,获取响应内容
BufferedReader br = new BufferedReader(new InputStreamReader(is)); //定义BufferedReader输入流读取URL响应
String line= "";
StringBuilder result = new StringBuilder(); //定义StringBuilder来将读取结果添加成 一个string
while ((line = br.readLine())!=null){
result.append(line);
}
Message message = new Message();
message.obj = result.toString();
handler.sendMessage(message);
System.out.println(message);
Log.e("TAG","333333333");
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
public static void setBitmap(final ImageView img,final String img_url){
new Thread(new Runnable() {
@Override
public void run() {
try {
HttpURLConnection conn = (HttpURLConnection) new URL(img_url).openConnection();
conn.connect();
InputStream is = conn.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(is); //从输入流解析创建Bitmap
img.setImageBitmap(bitmap); //设置ImageView要显示的图片
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
先是把getJson.php得到
1.新建一个Handler,用于处理数据,在handleMessage中处理
2.将得到的数据变成JSONArray,在转化成JSONObject,将jsonObject.getString()得到的响应值赋给属性值,添加到Newslist中
3.adapter通知更新
package com.news;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import com.google.gson.Gson;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener{
private ListView lvNews;
private NewsAdapter adapter;
private List newsList;
private static final String getURL = "http://192.168.253.1//test/getJson.php";
private Handler getNewsHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
String jsonData = (String) msg.obj;
System.out.println(jsonData);
//解析JSON数据
try {
/*JSONObject jsonObject = new JSONObject(jsonData);
JSONArray jsonArray = jsonObject.getJSONArray(String.valueOf(newsList));*/
Gson gson = new Gson();
//JSONArray jsonArray = new JSONArray(gson.toJson(jsonData));
JSONArray jsonArray = new JSONArray(jsonData);
if (jsonArray.length() == 0){
System.out.println("this is null");
}
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String title = jsonObject.getString("title");
String desc = jsonObject.getString("desc");
String time = jsonObject.getString("time");
String content_url = jsonObject.getString("content_url");
String img_url = jsonObject.getString("img_url");
System.out.println("title:" + title);
newsList.add(new News(title, desc, time, content_url, img_url));
adapter.notifyDataSetChanged();//通知更新
}
} catch (JSONException e) {
e.printStackTrace();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.activity_main_toolbar);
setSupportActionBar(toolbar);
toolbar.setLogo(R.mipmap.ic_launcher);//设置图标
toolbar.setTitle("My Title");//标题
toolbar.setSubtitle("Sub title");//副标题
setSupportActionBar(toolbar);
lvNews = (ListView)findViewById(R.id.lvNews);
newsList = new ArrayList<>();
adapter = new NewsAdapter(this,newsList);
lvNews.setAdapter(adapter);
lvNews.setOnItemClickListener(this);
HttpUtils.getNewsJson(getURL,getNewsHandler);
}
public static String formatString(String s) {
if (s != null) {
s = s.replaceAll("\ufeff", "");
}
return s;
}
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
News news = newsList.get(position);
Intent intent = new Intent(this,BrowsNewsActivity.class);
intent.putExtra("content_url",news.getContent_url());
startActivity(intent);
}
}
1.这里引用的是本机下的PHP文件,所以ip要是自己电脑的,可以通过cmd->ipconfig查看自己电脑的,在测试的时候如果用的是真机测试,要注意电脑和手机访问的是同一网络,通俗点说就是在一个无线。
2.在将收到的string message对象赋给JSONArray时,会报错,JSONException: Value
自此大致就结束了,当然别忘记在manifests中加入internet权限