AsyncHttp+gson解析
网上其实也有很多类似的这种框架 不过还是觉得自己写的用着比较方便,(ps:自己的总是最好的 ^_^)
闲下来整理出来了自己之前用过的框架 拿出来封装了一下。也写个记录,省的以后忘了。
本框架利用的是Async-Http.jar+gson.jar进行二次封装。
首先 先建立一个抽象类,并定义一些常用的抽象方法:
1 public abstract class HttpRequest { 2 3 /** 4 * @description: 获取参数 5 * @author:hc 6 * @return:RequestParams 7 * @return 8 */ 9 10 public abstract RequestParams getParams(); 11 12 /** 13 * @description: 14 * @author:hc 15 * @return:String 16 * @return 17 */ 18 19 public abstract String getUrlString(); 20 21 /** 22 * @description: 23 * @author:hc 24 * @return:void 25 * @param arg3 26 */ 27 28 public abstract void onFailure(Throwable arg3); 29 30 /** 31 * @description: 32 * @author:hc 33 * @return:void 34 * @param arg2 35 */ 36 37 public abstract void onSuccess(String result); 38 }
然后定义网络访问成功和失败的接口:
1 public interface HttpSuccess<T> {
2
3 public void onSuccess(T result);
4
5 }
public interface HttpError {
public void onError(Throwable arg0) ;
}
接下来定义一个泛型类来接收服务器返回的数据:
public class HttpData<T> { /** * @param cls * @param param * @param httpSuccess * @param httpError * @return */ public HttpClassRequest<T> newHttpRequest(Class<T> cls, HashMap<String, String> param, HttpSuccess<T> httpSuccess, HttpError httpError) { // 如果这里请求需要添加公共参数在此添加 // param.put(key, value) return new HttpClassRequest<T>(cls, param, httpSuccess, httpError); } }
然后是请求数据处理类:
1 public class HttpClassRequest<T> extends HttpRequest { 2 3 private HashMap<String, String> params; 4 private HttpError error; 5 6 private HttpSuccess<T> success; 7 8 private Class<T> cls; 9 10 /** 11 * create a instance HttpRequest. 12 * 13 * @param cls 14 * @param map 15 * @param httpSuccess 16 * @param httpError 17 */ 18 public HttpClassRequest(Class<T> cls, HashMap<String, String> map, HttpSuccess<T> httpSuccess, HttpError httpError) { 19 this.cls = cls; 20 this.params = map; 21 this.success = httpSuccess; 22 this.error = httpError; 23 24 } 25 26 /** 27 * @description: 获取参数 28 * @author:hc 29 * @return:RequestParams 30 * @return 31 */ 32 33 @Override 34 public RequestParams getParams() { 35 // TODO Auto-generated method stub 36 final RequestParams requestParams = new RequestParams(); 37 38 StringBuilder stringBuilder = new StringBuilder(); 39 Iterator<String> iterator = params.keySet().iterator(); 40 41 while (iterator.hasNext()) { 42 43 String key = iterator.next().toString(); 44 45 requestParams.put(key, params.get(key)); 46 47 String val = params.get(key); 48 stringBuilder.append("&" + key + "=" + val); 49 50 } 51 52 CustomLog.d("提交参数为 %s", "=" + stringBuilder.toString()); 53 54 return requestParams; 55 } 56 57 /** 58 * @description: 59 * @author:hc 60 * @return:String 61 * @return 62 */ 63 64 @Override 65 public String getUrlString() { 66 return Constant.url; 67 } 68 69 /** 70 * @description: 71 * @author:hc 72 * @return:void 73 * @param arg3 74 */ 75 76 @Override 77 public void onFailure(Throwable arg3) { 78 if (error != null) 79 error.onError(arg3); 80 } 81 82 /** 83 * @description: 84 * @author:hc 85 * @return:void 86 * @param arg2 87 */ 88 89 @Override 90 public void onSuccess(String arg2) { 91 92 Gson gson = new Gson(); 93 94 CustomLog.d("结果是=%s", arg2); 95 96 try { 97 if (success != null) 98 success.onSuccess(gson.fromJson(arg2, cls)); 99 } catch (JsonSyntaxException e) { 100 101 if (error != null) 102 error.onError(e); 103 } 104 105 } 106 }
类中的方法是由抽象类中继承下来的方法:分别是 getParams() 对请求参数进行封装;getUrlString() 返回请求连接;onFailure(Throwable throwable) 请求失败处理;onSuccess(String result) 请求成功的处理,其中 在返回成功的时候拿到返回数据,并把他封装成json对象数据回调出去。
接下来就是重点了:
1 public class HttpRequestQueque { 2 3 private AsyncHttpClient client;// 实例话对象 4 5 private HttpRequest _httpRequst; 6 7 private RequestParams params; 8 9 /** 10 * create a instance HttpRequestQueque. 11 * 12 * @param context 13 */ 14 public HttpRequestQueque(Context context) { 15 client = new AsyncHttpClient(); 16 client.setTimeout(30000); 17 } 18 19 /** 20 * @description: 添加请求 21 * @author:hc 22 * @return:void 23 * @param httpRequst 24 */ 25 26 public void add(HttpRequest httpRequst) { 27 this._httpRequst = httpRequst; 28 this.cance(); 29 params = httpRequst.getParams(); 30 31 CustomLog.d("JSONObject=%s", _httpRequst.getUrlString()); 32 33 this._get(_httpRequst.getUrlString(), params, new TextHttpResponseHandler() { 34 35 @Override 36 public void onFailure(int arg0, Header[] arg1, String arg2, Throwable arg3) { 37 38 CustomLog.d("http_stats_code=%s", " " + arg0); 39 40 _httpRequst.onFailure(arg3); 41 42 } 43 44 @Override 45 public void onSuccess(int arg0, Header[] arg1, String arg2) { 46 // TODO Auto-generated method stub 47 _httpRequst.onSuccess(arg2); 48 } 49 }); 50 51 } 52 53 /** 54 * @description: post 上传 55 * @author:hc 56 * @return:void 57 * @param httpRequst 58 */ 59 60 public void addPost(HttpRequest httpRequst) { 61 62 this._httpRequst = httpRequst; 63 64 params = httpRequst.getParams(); 65 66 CustomLog.d("SERVER_URL_POST==%s", _httpRequst.getUrlString()); 67 68 this._post(_httpRequst.getUrlString(), params, new AsyncHttpResponseHandler() { 69 70 @Override 71 public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { 72 _httpRequst.onSuccess(new String(responseBody)); 73 74 } 75 76 @Override 77 public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { 78 79 CustomLog.d("statusCode ==== %d", statusCode); 80 _httpRequst.onFailure(error); 81 82 } 83 }); 84 85 } 86 87 /** 88 * @description: 取消加载 89 * @author:hc 90 * @return:void 91 */ 92 93 public void cance() { 94 client.cancelAllRequests(true); 95 } 96 97 /** 98 * @description: 執行http请求 99 * @author:hc 100 * @return:void 101 * @param urlString 102 * @param params 103 * @param res 104 */ 105 106 private void _get(String urlString, RequestParams params, AsyncHttpResponseHandler res) // url里面带参数 107 { 108 client.get(urlString, params, res); 109 } 110 111 /** 112 * @description: 执行post请求 113 * @author:hc 114 * @return:void 115 * @param urlString 116 * @param params 117 * @param res 118 */ 119 120 private void _post(String urlString, RequestParams params, AsyncHttpResponseHandler res) // url里面带参数 121 { 122 123 client.post(urlString, params, res); 124 } 125 }
之前的代码都是为了使用方便进行二次封装,最终使用的是在这里使用async-http.jar进行网络访问,然后回调我们写的方法,让我们更加快捷的拿到结果。
好了 接下来要看怎么去使用了
首先我们需要根据后台给出的接口定义我们的javabean;
javabean需要对应着后台返回的json对象来建立:如返回的json是
{
System_id:xxxxx
items:[
obj:xxxx
]
}
这样我们就需要建立两个javabean,javabean的成员变量的名字必须要与json节点的名字相同,否则gson无法解析。
1 public class JsonObj { 2 3 String System_id; 4 ArrayList<Itemobj> items; 5 6 public String getSystem_id() { 7 return System_id; 8 } 9 10 public void setSystem_id(String system_id) { 11 System_id = system_id; 12 } 13 14 public ArrayList<itemObj> getItems() { 15 return items; 16 } 17 18 public void setItems(ArrayList<itemObj> items) { 19 this.items = items; 20 } 21 }
1 public class Itemobj{ 2 String obj 3 4 private get…… 5 private set…… 6 7 }
然后则开始使用我们的框架进行网络访问了,代码如下:
先建立一个网络访问的方法:
1 public class JsonTextData { 2 3 /** 4 * 5 * getFindList: 请求同时获取返回obj 6 * TODO(这里描述这个方法适用条件 – 可选) 7 * TODO(这里描述这个方法的执行流程 – 可选) 8 * TODO(这里描述这个方法的使用方法 – 可选) 9 * TODO(这里描述这个方法的注意事项 – 可选) 10 * 11 * @param @param type 12 * @param @param typeId 13 * @param @param page 14 * @param @param friendId 15 * @param @param httpSuccess 16 * @param @param httpError 17 * @param @return 设定文件 18 * @return HttpClassRequest<JsonObj> DOM对象 19 * @throws 20 * @since CodingExample Ver 1.1 21 */ 22 public static HttpClassRequest<JsonObj> getTestObj(String page, 23 HttpSuccess<JsonObj> httpSuccess, HttpError httpError) { 24 HashMap<String, String> hashMap = new HashMap<String, String>(); 25 26 hashMap.put("r", "DiscoveryContent/list"); 27 hashMap.put("pageSize", "10"); 28 hashMap.put("page", page); 29 30 31 HttpData<JsonObj> huiHenDuoData = new HttpData<JsonObj>(); 32 return huiHenDuoData.newHttpRequest(JsonObj.class, hashMap, httpSuccess, httpError); 33 34 } 35 }
然后在我们在请求网络数据的地方使用:
public class MainActivity extends Activity { private HttpRequestQueque requestQueque; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); requestQueque = new HttpRequestQueque(MainActivity.this); requestQueque.add(JsonTextData.getTestObj("1", new HttpSuccess<JsonObj>() { @Override public void onSuccess(JsonObj jsonObj) { String obj = jsonObj.getSystem_id(); } }, new HttpError() { @Override public void onError(Throwable arg0) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "失败了!!!!!", 1).show(); } })); } }
这样我们就能够轻而易举的拿到服务器给返回的数据了。
大功告成!
另附上源码地址:
有兴趣的同学可以下载下来看看 ^_^!!
http://pan.baidu.com/s/1qW9k4Kc
框架中还加入了一个上拉刷新和下拉加载的自定义listview 不同的同学可以删除掉,结构很清楚。另外还希望大神们继续封装这个框架 令他成为一个更加方便的框架。
发挥开源精神 共享成果 分享喜悦!!