Android Handler泄露问题
来源:互联网 发布:人工智能编程入门 编辑:程序博客网 时间:2024/06/08 08:16
内部类引用导致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); }
0 0
- Android Handler泄露问题
- android 使用handler内存泄露问题
- android handler的内存泄露问题
- handler内存泄露问题
- android handler 内存泄露
- Android Handler内存泄露
- Android Handler 内存泄露
- android内存泄露:handler
- Android中Handler使用不当导致内存泄露的问题
- Android使用Handler造成的内存泄露问题的解决
- Android中使用中Handler的内存泄露问题
- Android Handler内存泄露分析
- Android内存泄露之Handler
- Android 防内存泄露handler
- Android内存泄露之Handler
- Android Handler之内存泄露
- 关于handler内存泄露的问题
- Handler导致的内存泄露问题
- Java中String、StringBuffer、StringBuilder的区别及面试经常出现的问题
- linux 自动生成configure和make文件
- 调整VNC屏幕宽度
- js取整、取余等常用方法
- web端基于java的文件上传下载
- Android Handler泄露问题
- 理解A*寻路算法
- iOS开发之利用MVVM框架来优化项目结构。对Controller瘦身以及MVC向MVVM框架的迁移。
- docker iptables配置
- NetFx40_IIS_schema_update.xml 配置文件的XML格式不正确
- Android使用SurfaceView播放视频 简单介绍
- prototype
- 字典转模型的几中方法
- java判断文件是否是utf8编码