Android Handler WeakReference处理

语言: CN / TW / HK

theme: channing-cyan

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

WeakReference 弱引用

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

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

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

如何避免内存泄漏?

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

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

首先创建一个回调接口BaseHandlerCallBack java public interface BaseHandlerCallBack { public void callBack(Message msg); }

java public class MainActivity extends AppCompatActivity implements BaseHandlerCallBack 重写抽象方法 当电量等于100的时候就归零,重新循环

```java @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的弱引用 ```java private static class NoLeakHandler extends Handler { private WeakReference 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);
        }
    }
}

创建Handlerjava private NoLeakHandler mHandler; ... mHandler = new NoLeakHandler(this); 最后 new 一个定时器 发送消息java new Timer().schedule(new TimerTask() { @Override public void run() { mHandler.sendEmptyMessage(0); } }, 0, 100); ```

效果图:

ezgif.com-gif-maker.gif