android hander怎样避免内存泄露

在使用Android Handler的时候,可能会遇到编译器给我们这种警告:

 

This Handler class should be static or leaks might occur

 

造成这个警告的原因是handler持有外层类(Activity等)的引用,同一时候消息队列中的Message对handler也持有引用,这样就造成一些资源不能回。从而可能造成内存泄露。

 

解决这个警告的办法即让handler不持有外部类的引用,怎么做到这一点呢,即将Handler设置为静态内部类即可了。将外部类(Activity等)传递给Handler。在Handler中建立弱引用(WeakReference).

 

为了可以使以后更好的使用Handler-Message机制,我这里对其进行了封装。用法见下。先看一下代码。

 

CBHandler.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package me.codeboy.android.common.component;

import android.os.Handler;
import android.os.Message;

import java.lang.ref.WeakReference;

import me.codeboy.android.common.app.CBActivity;

/**
 * Created by yuedong.lyd on 6/7/15.
 * <p>
 *    构建防止内存泄露的handler
 * </p>
 */

public class CBHandler {
    /**
     * 防止handler对activity有隐式引用,匿名内部类不会对外部类有引用
     */

   public static class UnleakHandler extends Handler {
        private final WeakReference<CBActivity> activity;

        public UnleakHandler(CBActivity activity) {
            this.activity =  new WeakReference<CBActivity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(activity.get() == null) {
                return;
            }
            activity.get().processMessage(msg);
        }
    }
}

 

CBActivity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package me.codeboy.android.common.app;

import android.app.Activity;
import android.os.Bundle;
import android.os.Message;

import me.codeboy.android.common.component.CBHandler;

/**
 * Created by yuedong.lyd on 6/8/15.
 */

public abstract  class CBActivity extends Activity{
    public CBHandler.UnleakHandler handler ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        handler = new CBHandler.UnleakHandler(this);
    }

    /**
     * 处理消息
     * @param msg
     */

    public abstract void processMessage(Message msg);
}

 

在使用中,我们仅仅需自己的Activity继承CBActivity就可以。在onCreate时自己主动创建UnleakHandler的实例handler,从CBHandler的代码中我们也能够看出来,UnleakHandler自己主动将收到的消息交给CBActivity中的processMessage进行处理。我们仅仅须要在发送消息的时候使用handler变量发送就可以,处理在processHandler中处理就可以。


很多其它文章请訪问小胖轩.

posted on   wgwyanfs  阅读(168)  评论(0编辑  收藏  举报

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示