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整体框架正在完善中,欢迎补充!




      


目录
相关文章
|
1月前
|
数据库 Android开发 开发者
构建高效Android应用:采用Kotlin协程优化网络请求处理
【2月更文挑战第30天】 在移动应用开发领域,网络请求的处理是影响用户体验的关键环节。针对Android平台,利用Kotlin协程能够极大提升异步任务处理的效率和简洁性。本文将探讨如何通过Kotlin协程优化Android应用中的网络请求处理流程,包括协程的基本概念、网络请求的异步执行以及错误处理等方面,旨在帮助开发者构建更加流畅和响应迅速的Android应用。
|
1月前
|
Java 调度 Android开发
构建高效Android应用:探究Kotlin多线程编程
【2月更文挑战第17天】 在现代移动开发领域,性能优化一直是开发者关注的焦点。特别是在Android平台上,合理利用多线程技术可以显著提升应用程序的响应性和用户体验。本文将深入探讨使用Kotlin进行Android多线程编程的策略与实践,旨在为开发者提供系统化的解决方案和性能提升技巧。我们将从基础概念入手,逐步介绍高级特性,并通过实际案例分析如何有效利用Kotlin协程、线程池以及异步任务处理机制来构建一个更加高效的Android应用。
41 4
|
1月前
|
API 数据库 Android开发
构建高效Android应用:探究Kotlin多线程优化策略
【2月更文挑战第14天】随着移动设备性能的日益强大,用户对应用程序的响应速度和流畅性要求越来越高。在Android开发中,合理利用多线程技术是提升应用性能的关键手段之一。Kotlin作为一种现代的编程语言,其协程特性为开发者提供了更为简洁高效的多线程处理方式。本文将深入探讨使用Kotlin进行Android多线程编程的最佳实践,包括协程的基本概念、优势以及在实际项目中的应用场景和性能优化技巧,旨在帮助开发者构建更加高效稳定的Android应用。
|
3月前
|
Java 调度 数据库
Android 性能优化: 如何进行多线程编程以提高应用性能?
Android 性能优化: 如何进行多线程编程以提高应用性能?
47 0
|
3月前
|
安全 API Android开发
Android网络和数据交互: 解释Retrofit库的作用。
Android网络和数据交互: 解释Retrofit库的作用。
38 0
|
3月前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
22 0
|
3月前
|
Linux Android开发
Android 正常运行所需的一系列 Linux 内核接口
Android 正常运行所需的一系列 Linux 内核接口
53 0
|
2天前
|
测试技术 Android开发
Android App获取不到pkgInfo信息问题原因
Android App获取不到pkgInfo信息问题原因
12 0
|
8天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android&#39;s AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
9 0
|
8天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
9 0

热门文章

最新文章