Android——使用Volley+fastJson在新线程中读取网络接口获取天气信息

简介: 一,关于Volley           其实最初对于网络数据的访问,我是没想到要用框架的,使用HttpURLConnection或者HttpGet or HttpPost都可以实现。但是why? why I have to use Volley?       Before Voll...



一,关于Volley


           其实最初对于网络数据的访问,我是没想到要用框架的,使用HttpURLConnection或者HttpGet or HttpPost都可以实现。但是why? why I have to use Volley?


       Before Volley:

              

class HttpURLConnection_post extends Thread{
		@Override
		public void run() {
			//设置请求的路径
			String strUrl="http://api.qingyunke.com/api.php";
			//
			//将请求的参数进行UTF-8编码,并转换成byte数组=
			try {
				String params="key="+URLEncoder.encode("free","UTF-8")+"appid="+URLEncoder.encode("0","UTF-8")+"msg="+URLEncoder.encode("天气梅州","UTF-8");
				byte[] postData=params.getBytes();
				//创建一个URL对象
				URL url=new URL(strUrl);
				//打开一个HttpURLConnection连接
				HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();
				//设置连接超时的时间
				urlConn.setDoOutput(true);
				//在使用post请求的时候,设置不能使用缓存
				urlConn.setUseCaches(false);
				//设置该请求为post请求
				urlConn.setRequestMethod("POST");
				urlConn.setInstanceFollowRedirects(true);
				//配置请求content-type
				urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencode");
				//执行连接操作
				urlConn.connect();
				//发送请求的参数
				DataOutputStream dos=new DataOutputStream(urlConn.getOutputStream());
				dos.write(postData);
				dos.flush();
				dos.close();
				//若请求成功通过读取连接的数据流,则获取返回的数据
				if(urlConn.getResponseCode()==200){
					//显示
    	        	InputStreamReader isr = new InputStreamReader(urlConn.getInputStream(), "utf-8");   
                    int i;   
                    String strResult = "";   
                    // read   
                    while ((i = isr.read()) != -1) {   
                    	strResult = strResult + (char) i;   
                    }   
                    isr.close();   
    	        	textview=(TextView)findViewById(R.id.textview1);
    	        	textview.setText(strResult); //显示在textView中
				}else
				{
					textview.setText(urlConn.getResponseCode()); //显示在textView中
				}
				
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
    }

      

         对于上面代码,我只能说只能将就着用。



       volley来源:

               Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架。在 Google I/O 2013 大会上发布。    

              从名字由来和配图中无数急促的火箭可以看出 Volley 的特点:特别适合数据量小,通信频繁的网络操作。(个人认为 Android 应用中绝大多数的网络操作都属于这种类型)。

           

        主要特点:

                 (1). 扩展性强。Volley 中大多是基于接口的设计,可配置性强。
                 (2). 一定程度符合 Http 规范,包括返回 ResponseCode(2xx、3xx、4xx、5xx)的处理,请求头的处理,缓存机制的支持等。并支持重试及优先级定义。
                 (3). 默认 Android2.3 及以上基于 HttpURLConnection,2.3 以下基于 HttpClient 实现,这两者的区别及优劣在4.2.1 Volley中具体介绍。
                 (4). 提供简便的图片加载工具。


       基于它有这么多的优点,而且比较官方正统,是在原始网络访问类的基础上的一个扩展及优化,所以,我们使用它来从网络中读写数据。


二,使用fastJson   

 

       安卓中的数据是以轻量高效的数据传输格式json作为载体的。所以,在安卓开发中,有很大一部分代码,我们是要对JSON字符串及对象或者集合进行转换的代码。


         我们可以使用传统的JSONObject或者JSONArray:

       

 //创建一个对象
		 JSONObject person=new JSONObject();
		 //创建数组对象
		 JSONArray phone=new JSONArray();
		 phone.put("123445");
		 try {
			person.put("name", "lhc");
			person.put("age", 100);
			//创建一个对象
			JSONObject address=new JSONObject();
			address.put("country","china");
			address.put("province","hebei");
			person.put("address", address);
			
			
		//JSON文本的解析
			JSONObject object=new JSONObject(person.toString());
			JSONArray array=object.getJSONArray("phone");
			String phonenum=(String) array.get(0);
			String name=object.getString("name");
			int age=object.getInt("age");
			JSONObject object1=object.getJSONObject("address");
			String country=object1.getString("country");
			String province=object1.getString("province");
			
			
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		

     

       但是这种做法并不高效,因此,我们可以使用fastjson或者jackjson来实现这个过程的简单操作。


三,关于安卓的开启新线程及为什么要使用异步处理消息类

       

     安卓系统的线程模型属于单线程模型,假如在非UI线程中去访问或者更新只能在UI线程中去更新的视图类就会报异常。但是很多耗时的操作又不能放在UI线程中,我们只能在主线程上start一个新线程,然后再新线程中放入我们的网络访问,IO访问等操作。

     但是当我们取到数据之后,因为在非UI线程中是不允许更新UI的组件视图的,所以我们要使用异步处理的消息类去通知主线程,完成更新视图的操作。

 

三,简单Demo


       首先是跟我的Json对应的实体类:

      

package com.example.demoproject;

public class WeatherInfo {

	private String result;//请求的结果
	private String content;//返回的内容
	public String getResult() {
		return result;
	}
	public void setResult(String result) {
		this.result = result;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	
}

    原json:

 

{

    "result": 0, 
    "content": " 北京天气{br}霾,18℃,东北风2级{br} 三天预测{br}[10月06日] 白天:霾,25℃,无持续风向;夜晚:雾,15℃,无持续风向{br}[10月07日] 白天:阴,25℃,无持续风向;夜晚:晴,13℃,北风{br}[10月08日] 白天:晴,19℃,北风;夜晚:多云,9℃,无持续风向"
}

   接着引用volley跟fastjson的jar包:



在AndroidManifest.xml中配置网络的访问权限:


<uses-permission android:name="android.permission.INTERNET"></uses-permission> 


Activity中代码:


package com.example.demoproject;


import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import com.alibaba.fastjson.JSON;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.Request.Method;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {

	 private static final int MSG_SUCCESS = 0;//获取天气信息成功的标识
	 private static final int MSG_FAILURE = 1;//获取天气信息失败的标识
	 
	 private TextView textView;
	 /*
		 * 这里拿到的RequestQueue是一个请求队列对象,
		 * 它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。
		 * RequestQueue内部的设计就是非常合适高并发的,
		 * 因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,
		 * 这是非常浪费资源的,基本上在每一个需要和网络交互的Activity中创建一个RequestQueue对象就足够了。
		 * */
	 private RequestQueue mQueue;
	 //用于更新UI线程的handler
	 private Handler mHandler=new Handler(){
		 //此方法在UI线程中执行
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what){
				case MSG_SUCCESS:
					WeatherInfo weather=(WeatherInfo)msg.obj; //获取消息信息
					textView.setText(weather.getContent());
					break;
				case MSG_FAILURE:
					textView.setText("获取信息失败,请稍后重试");
					break;
			}
		}
	 };
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		textView=(TextView)findViewById(R.id.textview1);
		mQueue=Volley.newRequestQueue(MainActivity.this); 
		new Thread(new WeatherTest()).start();//在新线程中读取数据并绑定
	}

	/*
	 * 读取天气数据使用的新线程
	 * 天气接口示例:
	 * 		http://api.qingyunke.com/api.php?key=free&appid=0&msg=天气北京
	 * */
	class WeatherTest implements Runnable{
			
			@Override
			public void run() {
				String strURL="http://api.qingyunke.com/api.php?key=free&appid=0&msg=";//请求数据的地址
				String strCity="";
				try {
					/*
					 * 注:volley中的参数必须进行编码,不然会出现乱码问题
					 * */
					strCity=URLEncoder.encode("天气北京","UTF-8");
				} catch (UnsupportedEncodingException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				strURL+=strCity;
				/*
				 * 使用Volley中封装的StringRequest对象来发送HTTP请求
				 * StringRequest需要三个参数:
				 * 		0,获取数据的方法
				 * 		1,目标服务器的URL地址
				 * 		2,服务器响应成功的回调
				 * 		3,服务器响应失败的回调
				 * */
			    StringRequest stringRequest = new StringRequest(Method.GET,strURL,  
			                            new Response.Listener<String>() {  
			                                @Override  
			                                public void onResponse(String response) {  
			                                	/*成功获取到数据之后的处理*/
			                                	WeatherInfo weatherInfo=null;
			                                	//将json串转为对象
			                                	weatherInfo=JSON.parseObject(response.toString(),WeatherInfo.class);
			                                	//绑定数据过程
			                                	mHandler.obtainMessage(MSG_SUCCESS,weatherInfo).sendToTarget();
			                                }  
			                            }, new Response.ErrorListener() {  
			                                @Override  
			                                public void onErrorResponse(VolleyError error) {  
			                                	//读取失败的处理
			                                	mHandler.obtainMessage(MSG_FAILURE).sendToTarget();  
			                                }
			                            });  
			    mQueue.add(stringRequest); //将请求添加到请求队列中
			}}
}

           




             JRKJ整体框架正在完善中,欢迎补充!




      


目录
相关文章
|
2天前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
23 15
一个Android App最少有几个线程?实现多线程的方式有哪些?
|
25天前
|
安全 网络安全 Android开发
安卓与iOS开发:选择的艺术网络安全与信息安全:漏洞、加密与意识的交织
【8月更文挑战第20天】在数字时代,安卓和iOS两大平台如同两座巍峨的山峰,分别占据着移动互联网的半壁江山。它们各自拥有独特的魅力和优势,吸引着无数开发者投身其中。本文将探讨这两个平台的特点、优势以及它们在移动应用开发中的地位,帮助读者更好地理解这两个平台的差异,并为那些正在面临选择的开发者提供一些启示。
114 56
|
4天前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android应用开发中的多线程编程,涵盖基本概念、常见实现方式及最佳实践。主要内容包括主线程与工作线程的作用、多线程的多种实现方法(如 `Thread`、`HandlerThread`、`Executors` 和 Kotlin 协程),以及如何避免内存泄漏和合理使用线程池。通过有效的多线程管理,可以显著提升应用性能和用户体验。
22 10
|
2天前
|
API Android开发 iOS开发
安卓与iOS开发中的线程管理对比
【9月更文挑战第12天】在移动应用的世界中,安卓和iOS平台各自拥有庞大的用户群体。开发者们在这两个平台上构建应用时,线程管理是他们必须面对的关键挑战之一。本文将深入探讨两大平台在线程管理方面的异同,通过直观的代码示例,揭示它们各自的设计理念和实现方式,帮助读者更好地理解如何在安卓与iOS开发中高效地处理多线程任务。
|
4天前
|
Java Android开发 开发者
安卓应用开发中的线程管理优化技巧
【9月更文挑战第10天】在安卓开发的海洋里,线程管理犹如航行的风帆,掌握好它,能让应用乘风破浪,反之则可能遭遇性能的暗礁。本文将通过浅显易懂的语言和生动的比喻,带你探索如何优雅地处理安卓中的线程问题,从基础的线程创建到高级的线程池运用,让你的应用运行更加流畅。
|
1月前
|
调度 Android开发 开发者
【颠覆传统!】Kotlin协程魔法:解锁Android应用极速体验,带你领略多线程优化的无限魅力!
【8月更文挑战第12天】多线程对现代Android应用至关重要,能显著提升性能与体验。本文探讨Kotlin中的高效多线程实践。首先,理解主线程(UI线程)的角色,避免阻塞它。Kotlin协程作为轻量级线程,简化异步编程。示例展示了如何使用`kotlinx.coroutines`库创建协程,执行后台任务而不影响UI。此外,通过协程与Retrofit结合,实现了网络数据的异步加载,并安全地更新UI。协程不仅提高代码可读性,还能确保程序高效运行,不阻塞主线程,是构建高性能Android应用的关键。
37 4
|
16天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享安卓与iOS开发中的线程管理比较
【8月更文挑战第30天】本文将探讨网络安全与信息安全的重要性,并分享关于网络安全漏洞、加密技术和安全意识的知识。我们将了解常见的网络攻击类型和防御策略,以及如何通过加密技术和提高安全意识来保护个人和组织的信息安全。
|
17天前
|
安全 网络安全 Android开发
探索安卓开发之旅:从新手到专家网络安全与信息安全:防范网络威胁,保护数据安全
【8月更文挑战第29天】在这篇技术性文章中,我们将踏上一段激动人心的旅程,探索安卓开发的世界。无论你是刚开始接触编程的新手,还是希望提升技能的资深开发者,这篇文章都将为你提供宝贵的知识和指导。我们将从基础概念入手,逐步深入到安卓开发的高级主题,包括UI设计、数据存储、网络通信等方面。通过阅读本文,你将获得一个全面的安卓开发知识体系,并学会如何将这些知识应用到实际项目中。让我们一起开启这段探索之旅吧!
|
24天前
|
Android开发 开发者
Android项目架构设计问题之使用动态代理来增强 GoodsApi 接口的调用如何解决
Android项目架构设计问题之使用动态代理来增强 GoodsApi 接口的调用如何解决
12 0
|
24天前
|
Java 测试技术 Android开发
Android项目架构设计问题之构造一个Android中的线程池如何解决
Android项目架构设计问题之构造一个Android中的线程池如何解决
24 0