這裏主要針對“綜合”這個選項卡下的“資訊”模塊爲例子,對核心代碼進行解讀。
準備工作:參考我的另外一篇博客
http://blog.csdn.net/csp277/article/details/46610893
然後點擊下面的類
Class AsyncHttpResponseHandler
第一步:定義AsyncHttpResponseHandler,該handler對象將作爲Http請求的參數
protected AsyncHttpResponseHandler mHandler = new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers,
byte[] responseBytes) {
if (mCurrentPage == 0 && needAutoRefresh()) {
AppContext.putToLastRefreshTime(getCacheKey(),
StringUtils.getCurTimeStr());
}
if (isAdded()) {
if (mState == STATE_REFRESH) {
onRefreshNetworkSuccess();
}
executeParserTask(responseBytes);
}
}
@Override
public void onFailure(int arg0, Header[] arg1, byte[] arg2,
Throwable arg3) {
if (isAdded()) {
readCacheData(getCacheKey());
}
}
};
第二步:發送請求數據
發送數據主要是調用 AsyncHttpClient對象的get方法,第一步定義的handler作爲參數
protected void sendRequestData() {
OSChinaApi.getNewsList(mCatalog, mCurrentPage, mHandler);
}
public static void getNewsList(int catalog, int page,
AsyncHttpResponseHandler handler) {
RequestParams params = new RequestParams();
params.put("catalog", catalog);
params.put("pageIndex", page);
params.put("pageSize", AppContext.PAGE_SIZE);
if (catalog == NewsList.CATALOG_WEEK) {
params.put("show", "week");
} else if (catalog == NewsList.CATALOG_MONTH) {
params.put("show", "month");
}
ApiHttpClient.get("action/api/news_list", params, handler);
}
第三步:解析返回結果(在第一步的紅色代碼,開啓一個異步線程ParserTask)
其中繼承AsyncTask必須實現兩個方法:
1.doInBackground 一般在該方法裏處理比較耗時的操作
2.onPostExecute 一般在該方法裏更新UI
關於UI更新的異步操作問題以後會詳細歸納出來。這裏點到爲止。
具體的解析過程,用到了XStream框架。核心代碼:
obj = (T) xmStream.fromXML(is);
具體用法我會在後面的博客中繼續更新。
class ParserTask extends AsyncTask<Void, Void, String> {
private final byte[] reponseData;
private boolean parserError;
private List<T> list;
public ParserTask(byte[] data) {
this.reponseData = data;
}
@Override
protected String doInBackground(Void... params) {
try {
ListEntity<T> data = parseList(new ByteArrayInputStream( reponseData));
new SaveCacheTask(getActivity(), data, getCacheKey()).execute();
list = data.getList();
if (list == null) {
ResultBean resultBean = XmlUtils.toBean(ResultBean.class,
reponseData);
if (resultBean != null) {
mResult = resultBean.getResult();
}
}
} catch (Exception e) {
e.printStackTrace();
parserError = true;
}
return null;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
if (parserError) {
readCacheData(getCacheKey());
} else {
executeOnLoadDataSuccess(list);
executeOnLoadFinish();
}
}
}
總結: 學習了這種用 AsyncHttpClient 和 AsyncHttpResponseHandler 來進行Android端和Server端交互的方式。