关于内部类handler

写的程序里类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 class 就是为了断开MyHandler  和外部class的联系,让内部类和外部类不产生任何联系就是static class的目的。

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

所以,你只需要 在mAcivity 中定义 public XXX getXXX()方法把你需要提供给MyHandler  的变量封装起来,就可以啦。


你好,再请教阁下一个问题,我用mActivity直接访问它所属的Activity中的变量(包括私有的),是可以访问的。就没有用setter和getter(发现用getter和setter的话有很多的变量要设置getter和setter),不知道我的这种访问方式在设计上是否合理呢?

回答:

内部类,可以的

转载:http://bbs.csdn.net/topics/390240018

扩展:

同时需要注意的是,如果把AsyncTask作为Activity的内部类,AsyncTask会隐式地保存一个对Activity的引用。

也可以添加static.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值