• 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中处理就可以。


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

  • 相关阅读:
    HDOJ 1025 Constructing Roads In JGShining&#39;s Kingdom
    HDOJ 1274 展开字符串
    HDOJ 1503 Advanced Fruits
    Codeforces Round #187 (Div. 2) A,B
    HDOJ 1160 FatMouse&#39;s Speed
    HDOJ 1267 下沙的沙子有几粒?
    HDOJ 1224 Free DIY Tour
    山娃向大家问好啦。
    开发系统建议
    打开web全屏
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7391061.html
Copyright © 2020-2023  润新知