android hander如何避免内存泄露
2015-06-28 11:09
543 查看
在使用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
CBActivity
在使用中,我们只需自己的Activity继承CBActivity即可,在onCreate时自动创建UnleakHandler的实例handler,从CBHandler的代码中我们也可以看出来,UnleakHandler自动将收到的消息交给CBActivity中的processMessage进行处理。我们只需要在发送消息的时候使用handler变量发送即可,处理在processHandler中处理即可。
更多文章请访问小胖轩.
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); } } } |
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); } |
更多文章请访问小胖轩.
相关文章推荐
- Android SQLite数据库之事务的学习
- Android线程机制——AsyncTask
- android屏幕适配建议
- android listview 消除滑动到底端或者顶端时的黑色阴影
- android SDK下载及中文API地址
- (android之安全)Android 无源码动态调试工具
- android 最大化 视频播放 横屏
- Android 对像保存到文件
- (android之安全)ANDROID应用与系统安全防御
- 【Android】图片资源的访问与网格式图片浏览器
- Android Studio走过的坑
- Android 旋转ImageView
- Android 自动化测试
- Android LinearLayout模拟ListView
- Android 使ListView能够嵌入ScrollView
- android 常用第三方包的代码混淆
- Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效
- android 自定义自定义圆角dialog,消除黑色window背景
- Android快速开发系列 10个常用工具类
- Android - 错: java.lang.IllegalStateException: Already attached