Android Handler WeakReference处理

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

WeakReference 弱引用

定义:弱引用,与强引用(我们常见的引用方式)相对;特点是:GC在回收时会忽略掉弱引用对象(忽略掉这种引用关系),即:就算弱引用指向了某个对象,但只要该对象没有被强引用指向,该对象也会被GC检查时回收掉。 来源于网络 作者:小法老沙拉维

弱引用,其实弱字说明了一切——容易被销毁(GC),handler在处理一个延时任务,期间主线程被用户finish掉,但这里的对象却不能被销毁,这样造成内存泄漏,也容易造成NullPointException异常。

内存泄漏:内存空间使用完毕后没有被回收,就会导致内存泄漏。

如何避免内存泄漏?

可以使用什么方法?由此引出了弱引用。

之前写了篇文章 Android自定义view 使用代码绘制一个电池 只实现了电池效果,这次就让电池动起来 用handler处理一个延时任务,刷新电量 防止内存泄露,那就用WeakReference优雅处理

首先创建一个回调接口BaseHandlerCallBack

public interface BaseHandlerCallBack {
        public void callBack(Message msg);
    }
复制代码
public class MainActivity extends AppCompatActivity implements BaseHandlerCallBack
复制代码

重写抽象方法 当电量等于100的时候就归零,重新循环

 @Override
    public void callBack(Message msg) {
        switch (msg.what) {
            case 0:
               mBatteryView.setPower(power += 1);
                if (power == 100) {
                    power = 0;
                }
              
                break;
            default:
                break;
        }
    }

复制代码

当使用内部类(或者匿名类)来创建Handler的时候,Handler对象会隐式地持有一个外部类的对象(通常是Activity)

如果Handler不是静态对象,包含该Handler的activity 或者service 即使被结束,仍然无法被回收
所以使用静态内部类,通过WeakReference实现对Activity的弱引用

 private static class NoLeakHandler<T extends BaseHandlerCallBack> extends Handler {
        private WeakReference<T> wr;

        public NoLeakHandler(T t) {
            wr = new WeakReference<>(t);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            T t = wr.get();
            if (t != null) {
                t.callBack(msg);
            }
        }
    }
复制代码

创建Handler

private NoLeakHandler mHandler;
...
mHandler = new NoLeakHandler(this);
复制代码

最后 new 一个定时器 发送消息

new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                mHandler.sendEmptyMessage(0);
            }
        }, 0, 100);
复制代码

效果图:

ezgif.com-gif-maker.gif

猜你喜欢

转载自juejin.im/post/7032681138325815304