距离上一篇一起来开发Android天气软件二的时间又将近半个月了,之间一直因为有事而没有更新实在抱歉,最近会加快更新的步伐,争取在2015年到来前写完这系列的博文,上一章我们已经使用LitePal框架搭建好了我们所需的数据库,这一章的内容将主要完成关于从中国天气网获取数据的网络通信操作,之前有学习过Android开发的同学应该都知道,Android实现互联网通信主要有两种方法,一种使用HTTPURLCONNECTION,一种使用HttpClient的方式,而我们今天将使用不同于以上两种的方式,使用Volley框架完成我们的网络通信服务。
Volley框架呢是 2013年在Google I/O大会上推出了一个新的网络通信框架。Volley非常的简单易用,在通信性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,也比较适合我们这款软件吧。
package com.melhc.util;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpUtil {
/*
* 从服务器端获取省县市的数据
*/
public static void sendHttpRequest(final String address,
final HttpCallbackListener listener) {
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
HttpURLConnection connection = null;
try {
//创建一个url对象
URL url = new URL(address);
//通过url对象获取HTTPURLCONNCETION实例
connection = (HttpURLConnection) url.openConnection();
//设置http的请求所使用的方法为get方法
connection.setRequestMethod("GET");
//自由定制一些属性,比如设置连接超时,读取超时的毫秒数
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
//获得服务器返回的输入流
InputStream in = connection.getInputStream();
//将得到的输入流装换成String字符串
BufferedReader reader = new BufferedReader(
new InputStreamReader(in, "utf-8"));
StringBuffer response = new StringBuffer();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
LogUtil.i("HTTPUtil",
"------------------>" + response.toString());
if (listener != null) {
listener.onFinish(response.toString());
}
} catch (Exception e) {
// TODO: handle exception
if (listener != null) {
listener.onError(e);
}
} finally {
if (connection != null) {
connection.disconnect();
}
}
}
}).start();
}
}
上面的代码应该还是比较简单易懂的,因为网络通信操作是一个耗时操作,所以不能在主线程中使用,所以我们新开了一个子线程来获取数据!细心的朋友会发现上面的传入参数除了目标的访问网址,还传入了一个HttpCallBackListener对象,这个是干嘛用的呢?这里是用了一个回调机制,因为子线程是不允许有return对象的,而我们返回的数据可能又要运用到另一个类中的方法中使用,那么如何将该数据在两个类中传递呢,那么就会运用到回调机制。package com.melhc.util;
/*
* 网路连接的回掉接口
*/
public interface HttpCallbackListener {
void onFinish(String response);
void onError(Exception e);
}
然后接该方法作为参数传入我们的网络通信类中,其实他的实现方法跟我们Android常用的onCLickListener的实现原来一样,然后这个接口的具体实现在使用该类的地方实化,从而获取网络通信中得到的数据,该接口其实就成为了连接两个类中的桥梁。 HttpUtil.sendHttpRequest(address, new HttpCallbackListener() {
@Override
public void onFinish(String response) {
// TODO Auto-generated method stub
boolean result = false;
if ("province".equals(type)) {
result = Utility
.handleProvicesResponse(weatherDB, response);
} else if ("city".equals(type)) {
result = Utility.handleCitiesResponse(weatherDB, response,
selectedProvince);
} else if ("county".equals(type)) {
result = Utility.handleCountiesResponse(weatherDB,
response, selectedCity);
}
1. 创建一个RequestQueue对象。
2. 创建一个StringRequest对象。
3. 将StringRequest对象添加到RequestQueue里面。
具体的代码实现如下所示
RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
StringRequest stringRequest = new StringRequest(address,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
LogUtil.i("TAG", "---------------->"+response);
boolean result = false;
if ("province".equals(type)) {
result = Utility.handleProvicesResponse(weatherDB,
response);
} else if ("city".equals(type)) {
result = Utility.handleCitiesResponse(weatherDB,
response, selectedProvince);
} else if ("county".equals(type)) {
result = Utility.handleCountiesResponse(weatherDB,
response, selectedCity);
}
if (result) {
// 通过runonUiMainThread方法返回主线程处理逻辑
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
closeProgressDialog();
if ("province".equals(type)) {
queryProvinces();
} else if ("city".equals(type)) {
queryCities();
} else if ("county".equals(type)) {
queryCounties();
}
}
});
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
LogUtil.i("TAG", "-------------------->" + error);
runOnUiThread(new Runnable() {
@Override
public void run() { // TODO Auto-generated method
// stub //
closeProgressDialog();
Toast.makeText(getApplicationContext(),
"加载数据失败!", Toast.LENGTH_SHORT).show();
}
});
}
});
mQueue.add(stringRequest);
我们可以发现volley框架真的简单了很多,不需要我们去设置一些HTTP的通信属性以及一些回调方法,让我们只用去关心如何处理返回的数据即可,那么下面我们来逐条解析一下volley三步操作的每一步。 RequestQueue mQueue = Volley.newRequestQueue(context);
StringRequest stringRequest = new StringRequest(address,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("TAG", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
第二步发送http请求,其中要传入三个参数,第一个就是访问的目标网站的网址,第二个是成功回调得到数据后的方法,第三个是失败回调得到数据的方法,是不是很简单,省去了我们创建接口的过程。 mQueue.add(stringRequest);
最后,将这个StringRequest对象添加到RequestQueue里面就可以了,大功完成!好的,这一节课的内容就讲到这里,也希望大家能继续支持该系列的博文,你们的支持是我写下去的最大动力!今天的网络通信的内容就到此结束,下一篇博文也会很快跟大家见面的。原文地址:http://blog.csdn.net/gerogelin/article/details/42058443