AsyncHttp+gson解析

jopen 9年前發布 | 21K 次閱讀 Android開發 移動開發 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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!