距离上一篇一起来开发Android天气软件二的时间又将近半个月了,之间一直由于有事而没有更新实在抱歉,近期会加快更新的步伐。争取在2015年到来前写完这系列的博文,上一章我们已经使用LitePal框架搭建好了我们所需的数据库。这一章的内容将主要完毕关于从中国天气网获取数据的网络通信操作,之前有学习过Android开发的同学应该都知道,Android实现互联网通信主要有两种方法,一种使用HTTPURLCONNECTION,一种使用HttpClient的方式,而我们今天将使用不同于以上两种的方式,使用Volley框架完毕我们的网络通信服务。

Volley框架呢是 2013年在Google I/O大会上推出了一个新的网络通信框架。Volley非常的简单易用。在通信性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,也比較适合我们这款软件吧。

一、怎样获取数据

   怎样获取全国全部省份的信息呢。我们仅仅要要訪问下面网址 http://www.weather.com.cn/data/list3/city.xml,就会返回中国全部省份的名称和代号,例如以下所看到的。

01|北京,02|上海,03|天津,21|浙江等等,我们能够看到城市与其代号之间通过|号相隔开,省份与省份之间用。号隔开,记住这个结构。

之后的之后会用到正則表達式去截取。

   怎样查看浙江省下的城市的信息呢,事实上也非常easy,仅仅须要訪问下面网址http://www.weather.com.cn/data/list3/city21.xml,也就是仅仅须要将省级代号加入至city后面就能够了。server就会返回数据2101|杭州,2102|宁波。2103|温州等等。
   相同的方法,我们假设想訪问杭州下面的县市的信息,仅仅须要city加入2101就可以。例如以下示               http://www.weather.com.cn/data/list3/city2101.xml。

   以上我们就能够知道怎样获得全国省市区的信息了。那么怎样得到某详细城市的天气呢?以杭州市区为例他的县级代号为210101,那么訪问下面网址http://www.weather.com.cn/data/list3/city210101.xml就会返回一个非常easy的数据210101|101210101,后面的就是杭州市区所相应的天气代号,之后我们在用我们这个得到的代号就能够訪问下面网址http://www.weather.com.cn/data/cityinfo/101210101.html,注意这个网址后缀是html,不是xml了。写代码的时候不要写错了。这样server就会把杭州市区的天气信息已json格式的数据返回给我们,例如以下所看到的。
      {"weatherinfo":{"city":"杭州","cityid":"101210101","temp1":"1℃","temp2":"10℃","weather":"多云转晴","img1":"n1.gif","img2":"d0.gif","ptime":"18:00"}}

二、怎样实现网络通信

    我们如今已经知道訪问的网址的详细地址了。那么怎样通过我们的软件实现真正的网络通信呢。接下来我将先以使用HTTPURLCONNCTION方法实现网络的数据获取,详细的代码例如以下所看到的。

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 {
/*
* 从server端获取省县市的数据
*/
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);
//获得server返回的输入流
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对象的。而我们返回的数据可能又要运用到还有一个类中的方法中使用。那么怎样将该数据在两个类中传递呢。那么就会运用到回调机制。

    先创立一个HttpCallBackListener接口
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);
}

    这个就是详细实现类中的使用,这个类之后我们后面的博文中详细介绍,在此我们仅仅要注意在主线程中我们才实例化了这个HttpCallBackListener接口,通过response參数的传递继续完毕接下来的方法。
   传统的网络通信方法到此呢就讲完了,是不是认为还是挺麻烦的。还得使用什么回调机制,在Volley中可都不须要了。人家都帮我们封装好了。

三、Volley实现网络通信

接下来我们就開始正式使用Volley完毕上面一摸一样的通信流程,仅仅须要三步就可以完毕网络的发送与响应!首先还是得先下载一下Volley的jar文件。而且导入自己的程序中!volley.jar下载地址:http://download.csdn.net/detail/u013900875/8279223。接下来按下面三步走就可以!

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); 
    第一步首先须要获取到一个RequestQueue对象。注意这里拿到的RequestQueue是一个请求队列对象,它能够缓存全部的HTTP请求,然后依照一定的算法并发地发出这些请求。    
 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请求。当中要传入三个參数,第一个就是訪问的目标站点的网址,第二个是成功回调得到数据后的方法。第三个是失败回调得到数据的方法,是不是非常easy。省去了我们创建接口的过程。

    mQueue.add(stringRequest); 
    最后。将这个StringRequest对象加入到RequestQueue里面就能够了,大功完毕!好的。这一节课的内容就说到这里,也希望大家能继续支持该系列的博文。你们的支持是我写下去的最大动力!今天的网络通信的内容就到此结束,下一篇博文一起来开发Android的天气软件(四)——使用Gson解析数据
      下面是该应用的Git开源地址,https://github.com/melhc/SimpleWeather

一起来开发Android的天气软件(三)——使用Volley实现网络通信的更多相关文章

  1. 一起来开发Android的天气软件(四)——使用Gson解析数据

    离上一篇文章过去才4.5天,我们赶紧趁热打铁继续完毕该系列的天气软件的开发. 承接上一章的内容使用Volley实现网络的通信.返回给我们的是这一串Json数据{"weatherinfo&qu ...

  2. 从零開始开发Android版2048 (三)逻辑推断

    近期工作比較忙,所以更新的慢了一点,今天的主要内容是关于Android版2048的逻辑推断,经过本篇的解说,基本上完毕了这个游戏的主体部分. 首先还是看一下,我在实现2048时用到的一些存储的数据结构 ...

  3. Android网络编程(三)Volley使用方法全解析

    相关文章 Android网络编程(一)HTTP协议原理 Android网络编程(二)HttpClient与HttpURLConnection 前言 Volley想必许多人都用过,为了建立网络编程的知识 ...

  4. 用kotlin方式打开《第一行代码:Android》之开发酷欧天气(1)

    参考:<第一行代码:Android>第2版--郭霖 注1:本文为原创,例子可参考郭前辈著作:<第一行代码:Android>第2版 注2:本文不赘述android开发的基本理论, ...

  5. Android NFC技术(三)——初次开发Android NFC你须知道NdefMessage和NdefRecord

    Android NFC技术(三)--初次开发Android NFC你须知道NdefMessage和NdefRecord 这最近也是有好多天没写博客了,除了到处张罗着搬家之外,依旧还是许许多多的琐事阻碍 ...

  6. Xamarin For Visual Studio 3.0.54.0 完整离线破解版(C# 开发Android、IOS工具 吾乐吧软件站分享)

    Xamarin For Visual Studio就是原本的Xamarin For Android 以及 Xamarin For iOS,最新版的已经把两个独立的插件合并为一个exe安装包了.为了区分 ...

  7. 介绍开发Android手持终端PDA盘点APP软件

    介绍开发Android手持终端PDA盘点APP软件 软件需要自动识别我导入的TXT格式或者excl格式的盘点表,然后自动生成一个复盘数据,做AB比对,界面上需要显示的有总数量,单品数量,条码,编码,商 ...

  8. uni-app&H5&Android混合开发三 || uni-app调用Android原生方法的三种方式

    前言: 关于H5的调用Android原生方法的方式有很多,在该片文章中我主要简单介绍三种与Android原生方法交互的方式. 一.H5+方法调用android原生方法 H5+ Android开发规范官 ...

  9. Android开发之去掉标题栏的三种方法,推荐第三种

    Android:去掉标题栏的三种方法和全屏的三种方法 第一种:一般入门的时候常常使用的一种方法 onCreate函数中增加下面代码: requestWindowFeature(Window.FEATU ...

随机推荐

  1. 【Dior风格/舒适防风面料/抗静电里衬/大身撞色拼接/精致平驳领/时尚便西款/蓝绿色】玛萨玛索男装网购商城

    [Dior风格/舒适防风面料/抗静电里衬/大身撞色拼接/精致平驳领/时尚便西款/蓝绿色]玛萨玛索男装网购商城 [特价商品] Dior风格/舒适防风面料/抗静电里衬/大身撞色拼接/精致平驳领/时尚便西款 ...

  2. hdu 2757 Ocean Currents(优先队列+bfs)

    小伙伴们真心被这道题惊呆了!刚开始是读题,题目都把小伙伴惊呆了,题目都读不懂! 在前面猴子小伙伴的帮助下,理解了一点点,又偷偷的在纸上写写画画,明白了题意! 后来,你懂的,果断拿下!在拿下的过程也经过 ...

  3. 在 vb中 "end","unload me","exit sub" 之间的区别

    之前就想过这个问题,这么熟悉的几个东西居然对他们分析的不是很透彻. “End”  跟  “Unload  Me”  在敲程序 的时候经常敲到,“exit  sub”  更是熟悉,下面,解析: End  ...

  4. LVS:DR模式(Direct Routing)部署实验

    本文介绍怎样在kvm的虚拟环境下,部署实验LVS的DR模式.包含网络结构图,怎样配置.以及使用tcpdump分析ip包. 网络结构图                               kvm ...

  5. C++ 函数声明中指定,默认参数

    C++ 在声明函数的时候,如果指定了,参数的默认值,再调用函数的时候可以省略后面的参数. 如果调用函数写上的参数,但是不全.参数列表后面的使用默认值.如下例子,一看就清楚了. #include < ...

  6. jQuery 简单滑动轮播图效果

    一般页面简单轮播图效果用jQuery制作更加简单.我们来看看以下效果是如何来进行制作的. 其html结构下所示: <div id="box">         < ...

  7. img src某个php文件输出图片(回复更改图片readfile读取图片等)

    在论坛我们经常看到一回复图片就更改等,这功能是怎么实现的呢,其实更验证码道理相同. 新建文件 randimage.php 加入以下代码: <?php $dir='../../images/'; ...

  8. [置顶] IOS培训资料

    1 前言 今天给公司部门培训IOS,经过两天整理弄了个PPT和一个小的Demo,希望对大家入门有所帮助. 2 详述 培训内容,主要从开发环境讲起,到Objective-C的简单入门,IOS的简介,以及 ...

  9. 枚举+搜索 hdu-4431-Mahjong

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4431 题目大意: 给一副牌,求出所有能糊的牌. 解题思路: 枚举每一张牌,看能不能糊. 因为一共只有 ...

  10. 用定时器T0查询方式P0口8位控制LED闪烁

    #include<reg52.h> #define uchar unsigned char #define uint unsigned int void main (void) { uch ...