AsyncHttp+gson解析

jopen 9年前

网上其实也有很多类似的这种框架  不过还是觉得自己写的用着比较方便,(ps:自己的总是最好的 ^_^)

闲下来整理出来了自己之前用过的框架 拿出来封装了一下。也写个记录,省的以后忘了。

本框架利用的是Async-Http.jar+gson.jar进行二次封装。

 

首先 先建立一个抽象类,并定义一些常用的抽象方法:

public abstract class HttpRequest {        /**       * @description: 获取参数       * @author:hc       * @return:RequestParams       * @return       */        public abstract RequestParams getParams();        /**       * @description:       * @author:hc       * @return:String       * @return       */        public abstract String getUrlString();        /**       * @description:       * @author:hc       * @return:void       * @param arg3       */        public abstract void onFailure(Throwable arg3);        /**       * @description:       * @author:hc       * @return:void       * @param arg2       */        public abstract void onSuccess(String result);  }

然后定义网络访问成功和失败的接口:    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);        }  }

然后是请求数据处理类:

public class HttpClassRequest<T> extends HttpRequest {        private HashMap<String, String> params;      private HttpError error;        private HttpSuccess<T> success;        private Class<T> cls;        /**       * create a instance HttpRequest.       *        * @param cls       * @param map       * @param httpSuccess       * @param httpError       */      public HttpClassRequest(Class<T> cls, HashMap<String, String> map, HttpSuccess<T> httpSuccess, HttpError httpError) {          this.cls = cls;          this.params = map;          this.success = httpSuccess;          this.error = httpError;        }        /**       * @description: 获取参数       * @author:hc       * @return:RequestParams       * @return       */        @Override      public RequestParams getParams() {          // TODO Auto-generated method stub          final RequestParams requestParams = new RequestParams();            StringBuilder stringBuilder = new StringBuilder();          Iterator<String> iterator = params.keySet().iterator();            while (iterator.hasNext()) {                String key = iterator.next().toString();                requestParams.put(key, params.get(key));                String val = params.get(key);              stringBuilder.append("&" + key + "=" + val);            }            CustomLog.d("提交参数为   %s", "=" + stringBuilder.toString());            return requestParams;      }        /**       * @description:       * @author:hc       * @return:String       * @return       */        @Override      public String getUrlString() {          return Constant.url;      }        /**       * @description:       * @author:hc       * @return:void       * @param arg3       */        @Override      public void onFailure(Throwable arg3) {          if (error != null)              error.onError(arg3);      }        /**       * @description:       * @author:hc       * @return:void       * @param arg2       */        @Override      public void onSuccess(String arg2) {            Gson gson = new Gson();            CustomLog.d("结果是=%s", arg2);            try {              if (success != null)                  success.onSuccess(gson.fromJson(arg2, cls));          } catch (JsonSyntaxException e) {                if (error != null)                  error.onError(e);          }        }  }

类中的方法是由抽象类中继承下来的方法:分别是 getParams() 对请求参数进行封装;getUrlString() 返回请求连接;onFailure(Throwable throwable) 请求失败处理;onSuccess(String result) 请求成功的处理,其中 在返回成功的时候拿到返回数据,并把他封装成json对象数据回调出去。

接下来就是重点了:

 

public class HttpRequestQueque {        private AsyncHttpClient client;// 实例话对象        private HttpRequest _httpRequst;        private RequestParams params;        /**       * create a instance HttpRequestQueque.       *        * @param context       */      public HttpRequestQueque(Context context) {          client = new AsyncHttpClient();          client.setTimeout(30000);      }        /**       * @description: 添加请求       * @author:hc       * @return:void       * @param httpRequst       */        public void add(HttpRequest httpRequst) {          this._httpRequst = httpRequst;          this.cance();          params = httpRequst.getParams();            CustomLog.d("JSONObject=%s", _httpRequst.getUrlString());            this._get(_httpRequst.getUrlString(), params, new TextHttpResponseHandler() {                @Override              public void onFailure(int arg0, Header[] arg1, String arg2, Throwable arg3) {                    CustomLog.d("http_stats_code=%s", " " + arg0);                    _httpRequst.onFailure(arg3);                }                @Override              public void onSuccess(int arg0, Header[] arg1, String arg2) {                  // TODO Auto-generated method stub                  _httpRequst.onSuccess(arg2);              }          });        }        /**       * @description: post 上传       * @author:hc       * @return:void       * @param httpRequst       */        public void addPost(HttpRequest httpRequst) {            this._httpRequst = httpRequst;            params = httpRequst.getParams();            CustomLog.d("SERVER_URL_POST==%s", _httpRequst.getUrlString());            this._post(_httpRequst.getUrlString(), params, new AsyncHttpResponseHandler() {                @Override              public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {                  _httpRequst.onSuccess(new String(responseBody));                }                @Override              public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {                    CustomLog.d("statusCode ==== %d", statusCode);                  _httpRequst.onFailure(error);                }          });        }        /**       * @description: 取消加载       * @author:hc       * @return:void       */        public void cance() {          client.cancelAllRequests(true);      }        /**       * @description: 執行http请求       * @author:hc       * @return:void       * @param urlString       * @param params       * @param res       */        private void _get(String urlString, RequestParams params, AsyncHttpResponseHandler res) // url里面带参数      {          client.get(urlString, params, res);      }        /**       * @description: 执行post请求       * @author:hc       * @return:void       * @param urlString       * @param params       * @param res       */        private void _post(String urlString, RequestParams params, AsyncHttpResponseHandler res) // url里面带参数      {            client.post(urlString, params, res);      }  }

之前的代码都是为了使用方便进行二次封装,最终使用的是在这里使用async-http.jar进行网络访问,然后回调我们写的方法,让我们更加快捷的拿到结果。

 

 

好了  接下来要看怎么去使用了

首先我们需要根据后台给出的接口定义我们的javabean;

javabean需要对应着后台返回的json对象来建立:如返回的json是

System_id:xxxxx 

items:[

obj:xxxx

]

  }

这样我们就需要建立两个javabean,javabean的成员变量的名字必须要与json节点的名字相同,否则gson无法解析。

 

public class JsonObj {        String System_id;      ArrayList<Itemobj> items;        public String getSystem_id() {          return System_id;      }        public void setSystem_id(String system_id) {          System_id = system_id;      }        public ArrayList<itemObj> getItems() {          return items;      }        public void setItems(ArrayList<itemObj> items) {          this.items = items;      }  }

public class Itemobj{   String obj    private get……  private set……       }

然后则开始使用我们的框架进行网络访问了,代码如下:

先建立一个网络访问的方法:

public class JsonTextData {        /**       *        * getFindList: 请求同时获取返回obj       * TODO(这里描述这个方法适用条件 – 可选)       * TODO(这里描述这个方法的执行流程 – 可选)       * TODO(这里描述这个方法的使用方法 – 可选)       * TODO(这里描述这个方法的注意事项 – 可选)       *       * @param  @param type       * @param  @param typeId       * @param  @param page       * @param  @param friendId       * @param  @param httpSuccess       * @param  @param httpError       * @param  @return    设定文件       * @return HttpClassRequest<JsonObj>    DOM对象       * @throws        * @since  CodingExample Ver 1.1       */      public static HttpClassRequest<JsonObj> getTestObj(String page,              HttpSuccess<JsonObj> httpSuccess, HttpError httpError) {          HashMap<String, String> hashMap = new HashMap<String, String>();            hashMap.put("r", "DiscoveryContent/list");          hashMap.put("pageSize", "10");          hashMap.put("page", page);              HttpData<JsonObj> huiHenDuoData = new HttpData<JsonObj>();          return huiHenDuoData.newHttpRequest(JsonObj.class, hashMap, httpSuccess, httpError);        }  }

然后在我们在请求网络数据的地方使用:

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

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

来自:http://www.cnblogs.com/vampire-diaries/p/4647848.html