美文网首页
Handler防泄漏的正确使用姿势

Handler防泄漏的正确使用姿势

作者: RxCode | 来源:发表于2017-09-16 11:23 被阅读301次

某年某月某日在VLC的库源码里面看到的,总结一下


public class WeakHandler<T extends WeakHandler.MessageListener> extends Handler {
    private final WeakReference<T> mHandlerReference;

    public WeakHandler(T owner) {
        mHandlerReference = new WeakReference<>(owner);
    }


    @Override
    public void handleMessage(Message msg) {
        final T owner = getOwner();
        if (owner != null) {
            owner.handleMessage(msg);
        }
    }

    public interface MessageListener {
        public void handleMessage(Message msg);
    }

    public T getOwner() {
        return this.mHandlerReference.get();
    }

    public void clear() {
        mHandlerReference.clear();
    }
}

在activity里面使用


public class HandlerActivity extends Activity implements MyWeakHandler.MessageListener {

    private static MyWeakHandler<HandlerActivity> sHandler;//设置成静态成员,否则会出现内存泄漏
    public static final int MSG_ON_A = 0x111;
    public static final int MSG_ON_B = 0x112;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sHandler = new MyWeakHandler<>(this);
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        sHandler.removeCallbacksAndMessages(null);//清除所有未处理的消息
        sHandler.clear();
        sHandler=null;
    }

    private void backgroundWorkA() {

        .....
        //耗时操作,一般在线程的run方法或者Android系统框架回调放方法,比如低功耗蓝牙 BluetoothAdapter.LeScanCallback的 onLeScan()回调方法
        sHandler.obtainMessage(MSG_ON_A).sendToTarget();
        .....
    }

    private void backgroundWorkB() {

        ....
        //耗时操作
        sHandler.obtainMessage(MSG_ON_B).sendToTarget();
        .....
    }

    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) { //处理各种消息
            case MSG_ON_A:
                break;
            case MSG_ON_B:
                break;
        }

    }
}

相关文章

  • Handler防泄漏的正确使用姿势

    某年某月某日在VLC的库源码里面看到的,总结一下 在activity里面使用

  • Handler的正确使用姿势

    为了避免因为handler持有activity导致的内存泄漏 可以将内部类写成静态内部类 static class...

  • Handler

    一,什么是handler 二,handler的使用 三,handler机制原理 四,handler引起的内存泄漏和...

  • 重谈Handler的内存泄漏

    Handler 的内存泄漏问题 在多线程操作中,handler会使用的非常多,但是每次使用handler你有没有考...

  • 重谈Handler的内存泄漏

    Handler 的内存泄漏问题 在多线程操作中,handler会使用的非常多,但是每次使用handler你有没有考...

  • Handler的正确使用,防止内存泄漏

    如果Handler使用不当,会导致内存泄漏,直至内存溢出。因此,为了避免这种情况的发生,Handler要定义为st...

  • java基础

    Handler怎样防止内存泄漏 handler引起内存泄漏的原因:由于handler的写法问题,如果handler...

  • EditText延迟搜索

    使用Handler的延迟发送实现: 一般使用Handler会有一个内存泄漏的提示: 可以使用WeakReferen...

  • Android Handler 内存泄漏分析&解决方案

    一、前言 我们在开发过程中,经常使用 Handler,而使用 Handler 很容易造成内存泄漏,Android ...

  • 2018-04-18 Handler的基本用法

    1.Handler实现原理: 2.为了防止使用Handler导致内存泄漏,所以采用静态内部类MyHandler 使...

网友评论

      本文标题:Handler防泄漏的正确使用姿势

      本文链接:https://www.haomeiwen.com/subject/bauysxtx.html