在Activity中如何使用Handlder去除警告消息?
解决方法: static内部类+弱引用:
我们一般使用Handler都会写成一下形式,然后AndroidStudio就会提出警告(一大片被颜色渲染)
或者如图(警告):
翻译过来是:这个handler类应该为”静态”,否则可能内存泄露.解释:
- 执行了Activity的finish,但是被延迟处理还未处理的消息包含对Handler的引用.
- Handler是“匿名内部类”,持有外部的Activity的引用
- 导致Activity无法回收,很多资源都无法回收,产生了内存泄露
解决
- 静态内部类不对外部持有引用,所以定义成静态类的handler
- 加上个static警告就消失了
- 所要想解决全部问题,就还需要使用”弱引用”.
- 官方给出的建议写法:
- 内部类声明弱引用<引用外部类>对象
- 内部类构造时创建”弱引用<引用外部类>”对象
- 内部类的方法通过弱引用获取外部类对象,进行判断非空再操作
class OuterClass {
class InnerClass {
private final WeakReference<OuterClass> mTarget;
InnerClass(OuterClass target) {
mTarget = new WeakReference<OuterClass>(target);
}
void doSomething() {
OuterClass target = mTarget.get();
if (target != null) {
target.do();
}
}
}
所以根据介绍我们改进handler为:
static class myHandler extends Handler {
//弱引用<引用外部类>
WeakReference<Activity> mActivity;
myHandler(Activity activity) {
//构造创建弱引用
mActivity = new WeakReference<Activity>(activity);
}
@Override
public void handleMessage(android.os.Message msg) {
//通过弱引用获取外部类.
Activity activity = mActivity.get();
//进行非空再操作
if (activity != null) {
//doSomething
}
}
}
完美解决问题.