AndroidStudio完美解决"Activity使用Handler时出现警告信息"的问题

在Activity中如何使用Handlder去除警告消息?

解决方法: static内部类+弱引用:

  • 我们一般使用Handler都会写成一下形式,然后AndroidStudio就会提出警告(一大片被颜色渲染)
    这里写图片描述
    或者如图(警告):
    这里写图片描述
    翻译过来是:这个handler类应该为”静态”,否则可能内存泄露.

  • 解释:

    • 执行了Activity的finish,但是被延迟处理还未处理的消息包含对Handler的引用.
    • Handler是“匿名内部类”,持有外部的Activity的引用
    • 导致Activity无法回收,很多资源都无法回收,产生了内存泄露
  • 解决

    • 静态内部类不对外部持有引用,所以定义成静态类的handler
    • 加上个static警告就消失了
      这里写图片描述
    • 所要想解决全部问题,就还需要使用”弱引用”.
    • 官方给出的建议写法:
      • 内部类声明弱引用<引用外部类>对象
      • 内部类构造时创建”弱引用<引用外部类>”对象
      • 内部类的方法通过弱引用获取外部类对象,进行判断非空再操作
class OuterClass {

  class InnerClass {
    private final WeakReference mTarget;

    InnerClass(OuterClass target) {
           mTarget = new WeakReference(target);
    }

    void doSomething() {
           OuterClass target = mTarget.get();
           if (target != null) {
                target.do();    
           }
     }
}

所以根据介绍我们改进handler为:

static class myHandler extends Handler {
        //弱引用<引用外部类>
        WeakReference mActivity;

        myHandler(Activity activity) {
            //构造创建弱引用
            mActivity = new WeakReference(activity);
        }
        @Override
        public void handleMessage(android.os.Message msg) {
            //通过弱引用获取外部类.
            Activity activity = mActivity.get();
            //进行非空再操作
            if (activity != null) {
                //doSomething
            }
        }
    }

完美解决问题.

你可能感兴趣的:(Android)