Android Handler WeakReference处理
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
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
java
private NoLeakHandler mHandler;
...
mHandler = new NoLeakHandler(this);
最后
new 一个定时器 发送消息
java
new Timer().schedule(new TimerTask() {
@Override
public void run() {
mHandler.sendEmptyMessage(0);
}
}, 0, 100);
```
效果图:
- Jetpack Compose 双指的拖拽
- 多页面的过度动画
- 安卓从零开始写一个轻量级浏览器(一)
- 安卓从零开始写一个轻量级浏览器(二)
- Jetpack Compose自定义进度条ProgressIndicator
- Jetpack Compose Paging3 retrofit2封装上拉加载(一)
- Jetpack Compose 讲解如何利用Paging3实现分页加载
- Jetpack Compose自定义绘测 画太阳
- Jetpack Compose 教你打造一个会动的按钮
- Android封装一个异步执行器
- Android MaterialContainerTransform容器转换的使用
- Android仿微信图片浏览
- TCP/IP协议 入门
- Android自定义View相册图片的放大缩小
- Android自定义View——榜单自动滚动
- Android利用Poi实现excel的导出
- Android自定义加载进度条 自定义Dialog简洁弹窗
- Android Handler WeakReference处理
- Android解决ListView中getView()多次调用的问题
- Android自定义弹窗,实现仿ios底部弹窗