handler+WeakReference简单优化Activity

我们可能知道安卓引用对象的四中类型:强引用、软引用、弱引用、虚引用。但很少有人真正去使用这些,甚至不太清楚这些在程序代码中的作用,下面我就来简单分享一下我在代码中使用的弱引用WeakReference.

在程序中,我们用的比较多的就是handler机制了,但有没有想过handler给我们造成的严重的内存泄露问题?为什么这么说呢。Activity在被结束之后,MessageQueue并不会随之被结束,如果这个消息队列中存在msg,则导致持有handler的引用,但是又由于Activity被结束了,msg无法被处理,从而导致永久持有handler对象,handler永久持有Activity对象,于是发生内存泄漏。首先要想到的就是使用静态static,因为在java中所有非静态的对象都会持有当前类的强引用,而静态对象则只会持有当前类的弱引用。下面就开始看看我是怎么处理的吧。

private final mainHandler mHandler = new mainHandler(this);
    private static class mainHandler extends Handler {
        private final WeakReference<ListenClassFragment> mActivity;

        public mainHandler(ListenClassFragment activity) {
            mActivity = new WeakReference<ListenClassFragment>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            ListenClassFragment activity = mActivity.get();
            if (activity != null) {
                activity.flushDataList(msg);
            }
        }
    }
我们一个static和weakReference就很好的解决了这类内存泄露问题,接下来就来看看我在程序中是怎么使用的吧。

 public void flushDataList(Message msg) {
        if (msg.what == 1) {
            dataList.addAll(dataListTmp);
            if (dataList != null) {
                listenClassAdapter.setData(dataList);
                listenClassAdapter.notifyDataSetChanged();
                mListView.setPullLoadEnable(true);

            } else {

                mListView.setPullLoadEnable(false);
            }
            if (dataList.size() == 0) {
                mListView.setPullLoadEnable(false);
                rl_title.setVisibility(View.GONE);
                rl_none_one.setVisibility(View.VISIBLE);
            } else {
                rl_title.setVisibility(View.VISIBLE);
                rl_none_one.setVisibility(View.GONE);
            }
            dataListTmp.clear();
            mListView.stopRefresh();
        } else if (msg.what == 2) {
            dataList.addAll(dataListTmp);
            listenClassAdapter.setData(dataList);
            listenClassAdapter.notifyDataSetChanged();
            dataListTmp.clear();
            if (dataList.size() == 0) {
                rl_title.setVisibility(View.GONE);
                rl_none_one.setVisibility(View.VISIBLE);
            } else {
                rl_title.setVisibility(View.VISIBLE);
                rl_none_one.setVisibility(View.GONE);
            }
            mListView.setPullLoadEnable(false);
            mListView.stopLoadMore();
        }
    }
这就是简单的从服务器获取数据之后,通过这个handler来给listview的适配器添加数据。

通过这个 mHandler.sendEmptyMessage(?);来控制是下拉刷新的数据还是上拉加载的数据。代码来自于习惯,好的习惯能很好的优化程序。



猜你喜欢

转载自blog.csdn.net/greatdaocaoren/article/details/74931440
今日推荐