距离上一篇一起来开发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(); } }
package com.melhc.util; /* * 网路连接的回掉接口 */ public interface HttpCallbackListener { void onFinish(String response); void onError(Exception e); }
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); } });
mQueue.add(stringRequest);
2014博客之星请支持一下啊!http://vote.blog.csdn.net/blogstar2014/details?username=u013900875#content