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

在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
            }
        }
    }

完美解决问题.

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值