Android Handler泄露问题

原创 2016年05月30日 14:23:57
    • 内部类引用导致Activity的泄漏:

      • 最典型的场景是Handler导致的Activity泄漏,如果Handler中有延迟的任务或者是等待执行的任务队列过长,都有可能因为Handler继续执行而导致Activity发生泄漏。此时的引用关系链是Looper -> MessageQueue -> Message -> Handler -> Activity。为了解决这个问题,可以在UI退出之前,执行remove Handler消息队列中的消息与runnable对象。或者是使用Static + WeakReference的方式来达到断开Handler与Activity之间存在引用关系的目的。
    • Activity Context被传递到其他实例中,这可能导致自身被引用而发生泄漏:

      • 内部类引起的泄漏不仅仅会发生在Activity上,其他任何内部类出现的地方,都需要特别留意!我们可以考虑尽量使用static类型的内部类,同时使用WeakReference的机制来避免因为互相引用而出现的泄露。
  • 考虑使用Application Context而不是Activity Context;
  • 解决办法:
    package com.example.jiangwei18.myapplication;
    
    import android.animation.ObjectAnimator;
    import android.animation.TypeEvaluator;
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.animation.Interpolator;
    import android.widget.Button;
    import android.widget.ListView;
    import android.widget.Toast;
    
    import java.lang.ref.WeakReference;
    
    public class MainActivity extends Activity {
        private ListView lv;
        private final MyHandler handler = new MyHandler(this);;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            handler.sendEmptyMessageDelayed(0, 4000);
        }
      public static class MyHandler extends Handler{
          WeakReference<MainActivity> mActivity;
          public MyHandler(MainActivity activity){
               mActivity = new WeakReference<>(activity);
          }
    
          @Override
          public void handleMessage(Message msg) {
              MainActivity mainActivity = mActivity.get();
              Toast.makeText(mainActivity, "hello", Toast.LENGTH_LONG).show();
              super.handleMessage(msg);
          }
      }
    
        @Override
        protected void onDestroy() {
            handler.removeCallbacksAndMessages(null);
            super.onDestroy();
        }
    }
  • (1)static+WeakReference方式 
  • (2)
     /**
         * Remove any pending posts of callbacks and sent messages whose
         * <var>obj</var> is <var>token</var>.  If <var>token</var> is null,
         * all callbacks and messages will be removed.
         */
        public final void removeCallbacksAndMessages(Object token) {
            mQueue.removeCallbacksAndMessages(this, token);
        }

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android中使用中Handler的内存泄露问题

什么是内存泄露? Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到达状态,则将该对象从内存中回收。也就是说,一个对象不被任何引用所指...

Android中Handler使用不当导致内存泄露的问题

参考: http://www.linuxidc.com/Linux/2013-12/94065.htm http://www.cnblogs.com/fanglove/archive/2013/0...
  • chghz
  • chghz
  • 2015-03-22 20:54
  • 533

Android学习札记31:收集到的一些关于Handler和Runnable的问题(1)

提问者的大意如下:     在一个非UI线程中,如果连续给Handler对象post两个Runnable对象,那么第二个Runnable对象是不是需要等到第一个Runnable对象执行完之后才开始执...

Android_Handler机制详解及同步异步问题

为了引入Handler消息机制,我们必须先知道“同步”和“异步”通信的差别   “同步”通信: 比如 我打电话给小明,跟小明进行对话,我必须等到和小明结束通话之后,才能再拨打其他人的电话 (同步...

Android Handler.removeMessage移除所有postDelayed的问题

Android Handler.removeMessage暗坑在Android开发中,Handler的使用应该是比较多的,可以用它在UI线程中进行操作,也可以很方便的使用delay延时动作。 Han...

Android开发常见问题之Handler引起的内存泄漏

具体内容来自 http://droidyue.com/blog/2014/12/28/in-android-handler-classes-should-be-static-or-leaks-mig...

Android中handler消息机制中的一些细节问题

本文的编写是以博主前三篇博客为基础的,如果对handler详细机制有不理解的同学可以去参考下我的前三篇博客。   1.在handler中,为什么能实现消息的延迟发送?    是因为在enqueueMe...

Android学习之问题处理程序Handler

Handler是Android中的问题处理程序,它处理接收到的信息和执行传递的Runnable对象。当你在创建一个Handler对象时,系统会随之创建一个和该对象绑定在一起的一个线程信息的队列,Han...

Android线程1 Handler处理更新UI子线程问题

我们知道,每个eActivity都有一个Main线程,也称之为UI线程,当在子线程中更新UI线程中的元素就会出现Crash。解决方式就是通过handler解决。现在上代码,demo很简单,使用子线程更...

Android Handler removeMessages引发postDelayed失效的问题

最近遇到一个使用Handler removeMessages时使 使用boolean postDelayed(Runnable r, long delayMillis)函数post的Runnable也...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)