Android-Volley网络通信框架(自己定义Request 请求:实现 GsonRequest)

1.回想

   上篇学习了android 通过 volley 网络通信框架 实现 请求图片的三种方法!

2.重点

   (1)复习和熟悉 StringRequest ,JsonObjectRequest 方法

   (2)自己定义 GsonRequest : 实现 gson的调用 ,直接将请求字符串封装为对象

 

3.准备

    3.1 gson.jar 包 免积分下载:

             http://download.csdn.net/detail/lablenet/9026319

      3.2 Json字符串例如以下:

{  
    "code":1,  
    "msg":"success",  
    "data":{  
        "id":"1",  
        "tname":"电影",  
        "addtime":"1439809489",  
        "name":"机器人帝国",  
        "note":"三年前,外星机器人入侵地球,经过七天的战斗地球被全然占据。从此之后。机器人对人类严加看管,它们向人类头上安装了定位系统,一旦检測到人类走出家门便将其毁灭。除此之外,外星人雇佣罗宾(本·金斯利 Ben Kingsley 饰)等人类叛徒担任辅助管理工作。罗宾迷恋漂亮的妇人凯特(吉莲·安德森 Gillian Anderson 饰),但凯特仅仅痴心等待失踪的丈夫归来。

罗宾口口声声称凯特的丈夫早已遇害。只是她的儿子西恩(Callan McAuliffe 饰)并不相信,男孩始终未放弃寻找父亲的努力。某天,西恩意外和康纳(Milo Parker 饰)等伙伴发现令定位系统失效的办法。

孩子们尝试着走出家门,这一变故也让推翻机器人的统治成为可能… 机器人帝国机器人帝国机器人帝国机器人帝国机器人帝国机器人帝国机器人帝国机器人帝国", "pic":"image/2015080601.jpg", "url":"magnet:?xt=urn:btih:ed23cbd4377dc8c977c86acb8556085a0bba36de&tr=http://bt.mp4ba.com:2710/announce" } }


    3.3 实现 Model对象

    (1)标准化 对象 :sharedIfo 

          包括 code , msg ,data (不懂得看我文章:安卓通信数据标准化

package com.example.model;

public class sharedIfo {

	private int code;
	private String msg;
	private shared data;
	
	
	public int getCode() {
		return code;
	}
	public void setCode(int code) {
		this.code = code;
	}
	public String getMsg() {
		return msg;
	}
	public void setMsg(String msg) {
		this.msg = msg;
	}
	public shared getData() {
		return data;
	}
	public void setData(shared data) {
		this.data = data;
	}
	
}

      (2)shared 数据对象

package com.example.model;

public class shared {
    
	private int id;
	@Override
	public String toString() {
		return "shared [id=" + id + ", tname=" + tname + ", addtime=" + addtime
				+ ", name=" + name + ", note=" + note + ", pic=" + pic
				+ ", url=" + url + "]";
	}
	private String tname;
	private String addtime;
	private String name;
	private String note;
	private String pic;
	private String url;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getTname() {
		return tname;
	}
	public void setTname(String tname) {
		this.tname = tname;
	}
	public String getAddtime() {
		return addtime;
	}
	public void setAddtime(String addtime) {
		this.addtime = addtime;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getNote() {
		return note;
	}
	public void setNote(String note) {
		this.note = note;
	}
	public String getPic() {
		return pic;
	}
	public void setPic(String pic) {
		this.pic = pic;
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}

	
	
}

4. 实现 GsonRequset<T> 类

  通过继承 Request<T> ,实现 里面的方法 , 及构造函数的加入,来实现:

package com.example.volleyHttp;

import java.io.UnsupportedEncodingException;

import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.HttpHeaderParser;
import com.google.gson.Gson;



 /**
  * 自己定义 请求方法
  * @author yuan
  * http://blog.csdn.net/guolin_blog/article/details/17612763
  * @param <T>
  */
public class GsonRequest<T> extends Request<T> {

	private Listener<T> glistener;
	
	private Gson gson;
	
	private Class<T> gClass;
	
	/**
	 * 构造函数 。能够有多个不同參数的,这里就不加入了!
	 * @param method
	 * @param url
	 * @param listener
	 */
	public GsonRequest(int method, String url,Class<T> clazz,Listener<T> listener,ErrorListener errorlistener) {
		super(method, url, errorlistener);
		//初始化 參数
		gson=new Gson();
		gClass=clazz;
		glistener=listener;
	}

	@Override
	protected Response<T> parseNetworkResponse(NetworkResponse response) {
		try {
			//将字符流转成字符串,而且设置 字符编码 ,来自响应信息的报文都不信息
			String jsonString=new String(response.data,HttpHeaderParser.parseCharset(response.headers));
		
			//返回信息 使用 gson 直接转 对象。第二个參数 设置编码
			return Response.success(gson.fromJson(jsonString, gClass),HttpHeaderParser.parseCacheHeaders(response));
			
		
		} catch (UnsupportedEncodingException e) {
			// 出错的时候,将错误信息又一次调出
			return Response.error(new ParseError(e));
		}
	}

	@Override
	protected void deliverResponse(T response) {
		// TODO Auto-generated method stub
       glistener.onResponse(response);
	}

}

5.实现调用

   和 StringRequest 等 非常一样,实现构造函数传參数就可以。

   成功后:返回的sharedIfo对象,能够 操作;(须要自己理解)

	   /**
	    * //自己定义Request :使用 gson 直接将 json转换为对象
	    *  //使用自己定义Request 的方式 来请求数据
	    */
		private void gsonRequset_get(){
			
			GsonRequest<sharedIfo> gsonRequest=new GsonRequest<sharedIfo>(Method.GET,HttpPath.getSharedIfo(1),
					sharedIfo.class,new Listener<sharedIfo>() {

						@Override
						public void onResponse(sharedIfo response) {
							//成功 ,開始 获得sharedIfo对象
							//直接转 成 shared对象
							shared ifo=response.getData();
							
							tv.setText(       response.getCode()
									   +" | "+response.getMsg()
									   +" | "+ifo.toString());
							
							networkImageview_get(ifo.getPic());
							
						}
					},new Response.ErrorListener() {

						@Override
						public void onErrorResponse(VolleyError error) {
							tv.setText(error.getMessage());
							
						}
					});
			
			gsonRequest.setTag("gsonRequset");
			volleyApplication.getQueue().add(gsonRequest);
			
		}


6.总结

   总的来说,volley实现和用起来十分的方便,非常适合用在开发中!


7.demo  免积分下载

   http://download.csdn.net/detail/lablenet/9027783


posted @ 2017-06-17 09:48  wzzkaifa  阅读(151)  评论(0编辑  收藏  举报