经常,在我们使用Handler的时候,会出现This Handler class should be static or leaks might occur,对于有代码洁癖的人.来说时忍受不了的.
那么我们该怎么解决呢?
查阅了很多文章,大致的解释是:在程序消息队列中排队的消息保持了对目标Handler类的应用。如果Handler是个内部类,那么它也会保持它所在的外部类(通常是Activity或者Service等)的引用。只要有消息在队列中,那么Handler便无法被回收,如果Handler不是static那么使用Handler的Service和Activity就也无法被回收,这就可能导致内存泄露。
一般我们是在Handler中保持一个外部类的弱引用
//声明一个static class,继承自Handler, //并持有外部类的弱引用(此时假设外部类是ParentActivity) private static class MyHandler extends Handler { WeakReference mOuterClass; MyHandler(OuterClass clz) { mOuterClass clz= new WeakReference(clz); } @Override public void handleMessage(Message msg) { OuterClass clz= mOuterClass.get(); switch (msg.what) { case SOMETHING: clz.doSomething(); break; defaule: break; } } }; //然后声明,之后使用handler即可 private MyHandler handler = new MyHandler(this);
时间: 2024-10-25 03:09:52