oschina安卓源代码解析(八)main.java分析

首先是从网络获取数据 并通知UI

核心代码

private void loadLvNewsData(final int catalog, final int pageIndex,
            final Handler handler, final int action) {
        mHeadProgress.setVisibility(ProgressBar.VISIBLE);
        new Thread() {
            public void run() {
                Message msg = new Message();
                boolean isRefresh = false;
                if (action == UIHelper.LISTVIEW_ACTION_REFRESH
                        || action == UIHelper.LISTVIEW_ACTION_SCROLL)
                    isRefresh = true;
                try {
                    NewsList list = appContext.getNewsList(catalog, pageIndex,
                            isRefresh);
                    msg.what = list.getPageSize();
                    msg.obj = list;
                } catch (AppException e) {
                    e.printStackTrace();
                    msg.what = -1;
                    msg.obj = e;
                }
                msg.arg1 = action;
                msg.arg2 = UIHelper.LISTVIEW_DATATYPE_NEWS;
                if (curNewsCatalog == catalog)
                    handler.sendMessage(msg);
            }
        }.start();
    }

1 在onCreate函数中会使用initFrameListView 所有的listview 

2.调用loadLvNewsData 初始化所有的handler 光控制各个listview的handler就有6个

3.使用getLvHandler获取 news对于list的handler

4.使用loadLvNewsData 函数加载新闻数据

那么就分析一下加载的新闻数据吧:注意这里有些UI操作就省略了:

5.这里获取网络数据并没有在Activity中进行,(如果真的在这里进行就。。)而是在这个app的application 对象中进行的,这也导致了application 特别巨大,为什么不放在一个特别的类中呢?这个就不是很清楚了

6.AppContext的getNewsList函数会使用ApiClient请求网络数据去了

7.ApiClient根据传来的参数使用_MakeURL构造了请求URL

8.更加上面的网址请求服务器并获取返回的输入流

9.解析返回的输入流 使用的XmlPullParser解析的

10.现在有回到Main中了 既然数据都拿到了 那该发送消息通知UI更新了于是

handler.sendMessage(msg);

到此 获取数据 并通知UI阶段就完成了

第二阶段当然是更新UI了

核心代码

private Handler getLvHandler(final PullToRefreshListView lv,
            final BaseAdapter adapter, final TextView more,
            final ProgressBar progress, final int pageSize) {
        return new Handler() {
            public void handleMessage(Message msg) {
                if (msg.what >= 0) {
                    // listview数据处理
                    Notice notice = handleLvData(msg.what, msg.obj, msg.arg2,
                            msg.arg1);
 
                    if (msg.what < pageSize) {
                        lv.setTag(UIHelper.LISTVIEW_DATA_FULL);
                        adapter.notifyDataSetChanged();
                        more.setText(R.string.load_full);
                    } else if (msg.what == pageSize) {
                        lv.setTag(UIHelper.LISTVIEW_DATA_MORE);
                        adapter.notifyDataSetChanged();
                        more.setText(R.string.load_more);
 
                        // 特殊处理-热门动弹不能翻页
                        if (lv == lvTweet) {
                            TweetList tlist = (TweetList) msg.obj;
                            if (lvTweetData.size() == tlist.getTweetCount()) {
                                lv.setTag(UIHelper.LISTVIEW_DATA_FULL);
                                more.setText(R.string.load_full);
                            }
                        }
                    }
                    // 发送通知广播
                    if (notice != null) {
                        UIHelper.sendBroadCast(lv.getContext(), notice);
                    }
                    // 是否清除通知信息
                    if (isClearNotice) {
                        ClearNotice(curClearNoticeType);
                        isClearNotice = false;// 重置
                        curClearNoticeType = 0;
                    }
                } else if (msg.what == -1) {
                    // 有异常--显示加载出错 & 弹出错误消息
                    lv.setTag(UIHelper.LISTVIEW_DATA_MORE);
                    more.setText(R.string.load_error);
                    ((AppException) msg.obj).makeToast(Main.this);
                }
                if (adapter.getCount() == 0) {
                    lv.setTag(UIHelper.LISTVIEW_DATA_EMPTY);
                    more.setText(R.string.load_empty);
                }
                progress.setVisibility(ProgressBar.GONE);
                mHeadProgress.setVisibility(ProgressBar.GONE);
                if (msg.arg1 == UIHelper.LISTVIEW_ACTION_REFRESH) {
                    lv.onRefreshComplete(getString(R.string.pull_to_refresh_update)
                            + new Date().toLocaleString());
                    lv.setSelection(0);
                } else if (msg.arg1 == UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG) {
                    lv.onRefreshComplete();
                    lv.setSelection(0);
                }
            }
        };
    }

11 handleMessage这个函数是在 构造getLvHandler方法中实现的 根据android的handler机制,如果消息队列中有消息的时候 就会执行这个方法  由于上面的handler.sendMessage(msg);的handler是news对应的handler,刚才发送的消息就会给new对应的handler处理了

12 13 handleLvData 这个函数 是 在list添加 从网络获取的list

14 ok终于notifyDataSetChanged 这样new对于的listview就显示数据了


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值