android 无限循环 简书,Android Handler 解决循环引用

本文深入探讨了Android中由于Handler和Runnable引起的内存泄漏问题。非静态内部类默认持有对外部Activity的强引用,当Activity关闭后,由于MessageQueue中的消息未处理完,导致Handler无法释放,进而引发内存泄漏。同样的,postDelayed中的非静态内部类Runnable也会造成类似问题。为解决这个问题,建议将内部类转换为静态,并使用弱引用引用外部Activity,以确保在适当的时候可以被垃圾回收器回收,防止内存泄漏的发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

案例

public class MainActivity extends AppCompatActivity {

private Handler mHandler = new Handler(){

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

switch (msg.what){

...

}

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);

mHandler.postDelayed(new Runnable() {

@Override

public void run() {

...

}

}, 1000000);

}

}

(1)外部类Activity中定义了一个非静态内部类Handler,非静态内部类默认持有对外部类的引用。如果外部Activity突然关闭了,但是MessageQueue中的消息还没处理完,那么Handler就会一直持有对外部Activty的引用,垃圾回收器无法回收Activity,从而导致内存泄漏。

(2) 如上代码,在postDelayed中,我们在参数中传入一个非静态内部类Runnable,这同样会造成内存泄漏,假如此时关闭了Activity,那么垃圾回收器在接下来的1000000ms内都无法回收Activity,造成内存泄漏。

解决方案:

(1) 将非静态内部类Handler和Runnable转为静态内部类,因为非静态内部类(匿名内部类)都会默认持有对外部类的强引用。

(2) 改成静态内部类后,对外部类的引用设为弱引用,因为在垃圾回收时,会自动将弱引用的对象回收。

public class HandlerActivity extends AppCompatActivity {

private final MyHandler mHandler = new MyHandler(this);

private static final Runnable mRunnable = new Runnable() {

@Override

public void run() {

// 操作

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_fourth);

mHandler.postDelayed(mRunnable, 1000*10);

finish();

}

private static class MyHandler extends Handler {

WeakReference mWeakActivity;

public MyHandler(HandlerActivity activity) {

this.mWeakActivity = new WeakReference(activity);

}

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

final HandlerActivity mActivity = mWeakActivity.get();

if (mActivity != null) {

// 处理消息

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值