AsyncHttp+gson解析
網上其實也有很多類似的這種框架 不過還是覺得自己寫的用著比較方便,(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);
}</pre>
然后定義網絡訪問成功和失敗的接口:
1 public interface HttpSuccess<T> {
2
3 public void onSuccess(T result);
4
5 }
public interface HttpError {
public void onError(Throwable arg0) ;
}</pre>
接下來定義一個泛型類來接收服務器返回的數據:
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);
}
}</pre>
然后是請求數據處理類:
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);
}
}
}</pre>
類中的方法是由抽象類中繼承下來的方法:分別是 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);
}
}</pre>
之前的代碼都是為了使用方便進行二次封裝,最終使用的是在這里使用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;
}
}</pre>
public class Itemobj{
String obj
private get……
private set……
}</pre>
然后則開始使用我們的框架進行網絡訪問了,代碼如下:
先建立一個網絡訪問的方法:
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);
}
}</pre>
然后在我們在請求網絡數據的地方使用:
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();
}
}));
}
}</pre>
這樣我們就能夠輕而易舉的拿到服務器給返回的數據了。
大功告成!
另附上源碼地址:
有興趣的同學可以下載下來看看 ^_^!!
http://pan.baidu.com/s/1qW9k4Kc
框架中還加入了一個上拉刷新和下拉加載的自定義listview 不同的同學可以刪除掉,結構很清楚。另外還希望大神們繼續封裝這個框架 令他成為一個更加方便的框架。
發揮開源精神 共享成果 分享喜悅!!
來自:http://www.cnblogs.com/vampire-diaries/p/4647848.html