首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

关于handler及static变量的咨询解决方法

2013-08-16 
关于handler及static变量的咨询写的程序里类A中有一些操作比较耗时,就用了线程+handler,把耗时操作放到线

关于handler及static变量的咨询
写的程序里类A中有一些操作比较耗时,就用了线程+handler,把耗时操作放到线程里执行,完成后handler发送消息,然后再更新UI.
现在的问题是我在类里写的handler,总会提示一个警告:
This Handler class should be static or leaks might occur
我在网上搜索了这个警告,得到的解决方案是
Handler类应该应该为static类型,否则有可能造成泄露。在程序消息队列中排队的消息保持了对目标Handler类的应用。如果Handler是个内部类,那么它也会保持它所在的外部类的引用。为了避免泄露这个外部类,应该将Handler声明为static嵌套类,并且使用对外部类的弱应用。

大概使用范例是:


static class MyHandler extends Handler {
                WeakReference<PopupActivity> mActivity;

                MyHandler(PopupActivity activity) {
                        mActivity = new WeakReference<PopupActivity>(activity);
                }

                @Override
                public void handleMessage(Message msg) {
                        PopupActivity theActivity = mActivity.get();
                        switch (msg.what) {
                        case 0:
                                theActivity.popPlay.setChecked(true);
                                break;
                        }
                }
        };

        MyHandler ttsHandler = new MyHandler(this);
        private Cursor mCursor;

        private void test() {


                ttsHandler.sendEmptyMessage(0);
        }


假设这个handler类为B,这样一来,handler定义成static了,为了在该handler类中使用在类A中定义的一些变量,类A中的这些变量都得定义成static.
我想请教一下,这样大量的static变量对程序的运行有影响吗?会不会很耗内存呢?
多谢了~
[解决办法]
哈哈,应该没问题的。这static 并不是大量。。
[解决办法]
你的思路稍微有点点错误

static class 就是为了断开MyHandler  和外部class的联系,让内部类和外部类不产生任何联系就是static class的目的。

你不需要在Activity中通过申明大量的static 变量来提供给handler 使用(这样的代码不仅难看而且设计很不合理)。因为你在MyHandler  有一个mActivity的弱引用所以你可以调用mActivity的任何public 函数和变量。

所以,你只需要 在mAcivity 中定义 public XXX getXXX()方法把你需要提供给MyHandler  的变量封装起来,就可以啦。
[解决办法]
如果handler不是静态的,那么当这个activity destory后也有可能不被垃圾回收,这样就造成了所谓的内存泄漏

热点排行