「这是我参与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);
效果图:
今天的文章Android Handler WeakReference处理分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/23427.html