Android中Handler可能引起内存泄露

先来看一段代码:

1. private Handler mHandler = new Handler() {  
2.         @Override  
3.         public void handleMessage(Message msg) {  
4.             // ...  
5.          }  
6.     }; 

这样的写法eclipse会给出一个leak的提示This Handler class should be static or leaks might occur...,表示有可能出现内存泄漏,分析如下:
1) 当一个Handler对象在主线程中创建的时候,它会关联到Looper的message queue。Message添加到消息队列中的时候Message会持有当前Handler引用,当Looper处理到当前消息的时候,会调用Handler#handleMessage(Message).
2) 在java中,no-static的内部类会 隐式的 持有当前类的一个引用。static的类则没有。
3) 总结:由于非静态内部类Handler会持有外部类对象的引用,而Handler又由于Message处理的方式有可能常驻内存当中。这样就会导致外部的Activity或者Service在销毁之后无法及时被GC回收,甚至内存泄漏。

为此,为了避免泄露这个外部类,应该将Handler声明为static嵌套类,并且使用对外部类的弱应用。

1. static class MsgHandler extends Handler {  
2.     private WeakReference<Activity> mActivity;  
3.   
4.     MsgHandler(Activity activity) {  
5.         mActivity = new WeakReference<Activity>(activity);  
6.     }  
7.   
8.     @Override  
9.     public void handleMessage(Message msg) {  
10.         Activity activity = mActivity.get();  
11.         if (activity != null) {  
12.             activity.handleMessage(msg);  
13.         }  
14.     }  
15. }  
16.   
17. private Handler mHandler = new MsgHandler(this);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android ,`Handler` 是一个消息处理机制,它可以让你在不同的线程处理消息。在 Android ,UI 线程用于处理用户界面事件,而其他线程用于处理一些耗时的操作。当其他线程需要更新 UI 界面时,就需要通过 `Handler` 发送一条消息给 UI 线程,然后 UI 线程就可以处理这条消息并更新 UI 界面。 `Handler` 的使用非常简单,可以按照以下步骤进行: 1. 创建一个 `Handler` 实例。 2. 在其他线程,通过 `Handler` 的 `post()` 方法发送一条消息。 3. 在 UI 线程,重写 `Handler` 的 `handleMessage()` 方法,用于处理消息并更新 UI 界面。 例如,以下是一个简单的 `Handler` 的使用示例: ```java public class MainActivity extends AppCompatActivity { private Handler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mHandler = new Handler() { @Override public void handleMessage(Message msg) { // 更新 UI 界面 } }; new Thread(new Runnable() { @Override public void run() { // 执行耗时操作 // 发送消息到主线程更新 UI 界面 mHandler.post(new Runnable() { @Override public void run() { // 处理消息 } }); } }).start(); } } ``` 需要注意的是,`Handler` 持有外部类的引用,如果在其他线程使用匿名内部类创建 `Handler` 实例,可能引起内存泄漏问题。因此,在使用 `Handler` 时,建议使用静态内部类或独立的类来实现 `Handler`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值