Android中关于静态handdler弱引用的使用

在开发中我们经常会用到handler和AsyncTask, 常见的写法是直接使用内部类或都匿名内部类的方式. 但是在很多内存优化的地方指出, 这样的用法会导致内存泄露, 推存的用法是使用静态内部类 + 弱引用的方式.
但是我看过的很多篇文章中所带的代码似乎并不能让初学者知道具体怎么用, 于是有了这篇文章.

public class TestActivity extends Activity {
	TextView mtv;
	
	private static Handler handler = new Handler() {
		@Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
        }
	}
	...
	//其余部分代码省略
}

这便是我在看了使用静态内部类方式后改成的代码, 可是通常, 我们在handleMessage中会对当前Activity中的控件进行操作, 但现在我们在里面进行控件修改时, 发现android studio中会有如下报错
在这里插入图片描述
发现这个控件无法操作, 这时我才想起来那些文章中提到的弱引用是为什么了. 但是我在平时的开发中也没有用到过弱引用, 对这个概念只是有所耳闻而已, 实际要使用才发现不会, 百度搜索弱引用出来的结果大多也是是偏理论性的, 对使用起来的帮助是不大的, 我就在此着重讲一下用法.
比如说上面代码里出现的mtv, 我们平时用findviewById找到控件后赋值结mtv, 再之后我们对mtv的直接使用是强引用, 那么如果说要用弱引用是怎么样的呢, 如下

    WeakReference<TextView> weakReference = new WeakReference<>(mtv);
    TextView weakTv = weakReference.get();

再之后操作weakTv就是对mtv的弱引用. 以上是对弱引用的使用说明.
那么在静态handler中操作控件如何做到呢. 思路就是不再使用匿名内部类, 改为非匿名的方式, 继承于handler, 然后写一个参数为当前Activity的构造, 在内部类定义一个当前Activity类型的全局变量, 在构造中将其赋值为当前Activity的弱引用, 再要操作控件时, 用"弱引用.控件"的方式, 实际代码如下:

private class MyHandler extends Handler {
        TestActivity theActivity;

        public MyHandler(TestActivity testActivity) {
            theActivity = new WeakReference<TestActivity>().get();
        }

        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            theActivity.mtv.setText("Hello, World.");
        }
}

对handdler实例化的时候, 只需多传一个Activity的参数, 其它方面使用不变:

MyHandler myHandler = new MyHandler(TestActivity.this);

(完)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值