这里主要针对“综合”这个选项卡下的“资讯”模块为样例。对核心代码进行解读。
准备工作:參考我的另外一篇博客
http://blog.csdn.net/csp277/article/details/46610893
然后点击以下的类
Class AsyncHttpResponseHandler
第一步:定义AsyncHttpResponseHandler。该handler对象将作为Http请求的參数
protected AsyncHttpResponseHandler mHandler = new AsyncHttpResponseHandler() {@Overridepublic 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);}}@Overridepublic 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;}@Overrideprotected 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;}@Overrideprotected void onPostExecute(String result) {super.onPostExecute(result);if (parserError) {readCacheData(getCacheKey());} else {executeOnLoadDataSuccess(list);executeOnLoadFinish();}}}
总结: 学习了这样的用 AsyncHttpClient 和 AsyncHttpResponseHandler 来进行Android端和Server端交互的方式。