zoukankan      html  css  js  c++  java
  • OSChinaclient源代码学习(1)--Android与Server的交互

    这里主要针对“综合”这个选项卡下的“资讯”模块为样例。对核心代码进行解读。

    准备工作:參考我的另外一篇博客
    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端交互的方式。

  • 相关阅读:
    小白如何在Windows下使用Redis
    OAuth2.0实例说明
    关于EntityFramework 更新数据记录时字段全部更新问题和不从数据库中获取直接更新记录
    Asp.net Controller中View 和Action方法认证Authorize 及对AuthorizeAttribute扩展
    MidpointRounding 枚举值简要说明
    JavaScript 去空格方法(转部份)
    脏读,不可重复读,幻读 (转)
    20111204 15:36 JAVA实现位向量给无重复元素的整数数组排序
    JAVA String
    CSS样式表的优先级别
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7295073.html
Copyright © 2011-2022 走看看