转载

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 不同的同学可以删除掉,结构很清楚。另外还希望大神们继续封装这个框架  令他成为一个更加方便的框架。

发挥开源精神 共享成果 分享喜悦!!

正文到此结束
Loading...