您的位置:首页 > 移动开发 > Android开发

OSChina客户端源码学习(1)--Android与Server的交互

2015-07-13 19:47 651 查看
这里主要针对“综合”这个选项卡下的“资讯”模块为例子,对核心代码进行解读。

准备工作:参考我的另外一篇博客

/article/9147933.html

然后点击下面的类

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端交互的方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: