Android Handler WeakReference处理

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

「这是我参与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

今天的文章Android Handler WeakReference处理分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/23427.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注