直接创建Handler
warning: In Android, Handler classes should be static or leaks might occur.`。
`Android`程序第一次创建的时候,默认会创建一个`Looper`对象,`Looper`去处理`Message Queue`中的每个`Message`,主线程的`Looper`存在整个应用程序的生命周期.
- `Hanlder`在主线程创建时会关联到`Looper`的`Message Queue`,`Message`添加到消息队列中的时候`Message(排队的Message)`会持有当前`Handler`引用,当`Looper`处理到当前消息的时候,会调用`Handler#handleMessage(Message)`.就是说在`Looper`处理这个`Message`之前,会有一条链`MessageQueue -> Message -> Handler -> Activity`,由于它的引用导致你的`Activity`被持有引用而无法被回收`
- **在java中,no-static的内部类会隐式的持有当前类的一个引用。static的内部类则没有。**
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package com.audiocn.karaoke.utils; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.Handler.Callback; public class UIHandler { private static Handler handler = new Handler(Looper.getMainLooper(), new Callback() { public boolean handleMessage(Message msg) { return UIHandler.handleMessage(msg); } }); public UIHandler() { } private static boolean handleMessage(Message msg) { Object[] objs = (Object[])((Object[])msg.obj); Message inner = (Message)objs[0]; Callback callback = (Callback)objs[1]; return callback != null?callback.handleMessage(inner):false; } private static Message getShellMessage(Message msg, Callback callback) { Message shell = new Message(); shell.what = 1; shell.obj = new Object[]{msg, callback}; return shell; } private static Message getShellMessage(int what, Callback callback) { Message msg = new Message(); msg.what = what; return getShellMessage(msg, callback); } public static boolean sendMessage(Message msg, Callback callback) { return handler.sendMessage(getShellMessage(msg, callback)); } public static boolean sendMessageDelayed(Message msg, long delayMillis, Callback callback) { return handler.sendMessageDelayed(getShellMessage(msg, callback), delayMillis); } public static boolean sendMessageAtTime(Message msg, long uptimeMillis, Callback callback) { return handler.sendMessageAtTime(getShellMessage(msg, callback), uptimeMillis); } public static boolean sendMessageAtFrontOfQueue(Message msg, Callback callback) { return handler.sendMessageAtFrontOfQueue(getShellMessage(msg, callback)); } public static boolean sendEmptyMessage(int what, Callback callback) { return handler.sendMessage(getShellMessage(what, callback)); } public static boolean sendEmptyMessageAtTime(int what, long uptimeMillis, Callback callback) { return handler.sendMessageAtTime(getShellMessage(what, callback), uptimeMillis); } public static boolean sendEmptyMessageDelayed(int what, long delayMillis, Callback callback) { return handler.sendMessageDelayed(getShellMessage(what, callback), delayMillis); } public static boolean post(Runnable r) { return handler.post(r); } public static boolean postAtFrontOfQueue(Runnable r) { return handler.postAtFrontOfQueue(r); } public static boolean postDelayed(Runnable r, long delayMillis) { return handler.postDelayed(r, delayMillis); } public static boolean postAtTime(Runnable r, long uptimeMillis) { return handler.postAtTime(r, uptimeMillis); } public static boolean postAtTime(Runnable r, Object token, long uptimeMillis) { return handler.postAtTime(r, token, uptimeMillis); } public static void removeCallbacks(Runnable r) { handler.removeCallbacks(r); } public static void removeAllMessages() { handler.removeMessages(1); } public static void removeMessages(int what) { handler.removeMessages(what); } }
相关推荐
在android开发过程中,我们可能会遇到过令人奔溃的OOM异常,这篇文章主要介绍了Android Handler内存泄漏详解及其解决方案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
AndroidHandler内存泄漏详解及其解决方案.docx
内存泄露的危害就是会使虚拟机占用内存过高,导致OOM(内存溢出),程序出错。接下来通过本文给大家分享Android使用Handler造成内存泄露问题及解决方法,一起看看吧
主要介绍了详解Android使用Handler造成内存泄露的分析及解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了Android中Handler引起的内存泄露问题解决办法,本文讲解了导致内存泄露的情景,并给出了修改后的代码,需要的朋友可以参考下
Handler对象中使用匿名内部类或非静态内部类正确地释放消息避免内存泄漏或增加Native内存,在Android中,Handler对象通常会被用来在主线程(UI线程)中处理消息,以更新UI界面。当我们在Handler对象中使用匿名内部类...
主要介绍了Android应用的内存优化及Handler的内存泄漏问题,文中对Activity无法被回收而造成的内存泄漏给出了通常的解决方案,需要的朋友可以参考下
主要给大家介绍了关于iOS WKWebView中MessageHandler内存泄漏问题的完美解决过程,文中通过示例代码介绍的非常详细,对各位iOS开发者们具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
详细可参考博文:原创 android内存泄露:3、Handler的错误使用导致内存泄露 ,这篇文章我们将介绍:Toast的错误使用导致内存泄露 二、Toast的错误使用导致内存泄露 我们通常,连续点击按钮多次提示的 Toast,它...
本文主要介绍Android中Handler引起的内存泄露,在实际开发中经常会遇到使用Handler来写异步操作的功能,如果引起内存泄漏,看看怎么解决
LeakCanary一个直白的展示Android中内存泄露的工具。它是Square公司开源出来的内存泄露自动探测神器,能够在程序发生内存泄漏的时候在通知栏...本案例同时给出三个常见的内存泄露(单例,handler,线程)的解决方法。
HandlerDemo详细介绍了Handler的使用以及Handler导致内存泄漏的解决方案。
子线程不更新UI”,这个规定应该是初学必知的,那要怎么来解决口诀里的问题呢,这时候Handler就出现在我们面前了(AsyncTask也行,不过本质上还是对Handler的封装),来一段经典常用代码(这里忽略内存泄露问题,我们...
在 Android内存泄漏终极解决篇(上)中我们介绍了如何检查一个App是否存在内存泄漏的问题,本篇将总结典型的内存泄漏的代码,并给出对应的解决方案。内存泄漏的主要问题可以分为以下几种类型: 静态变量引起的内存...
关联篇:Handler内存泄漏详解及其解决方案 一说到Android的消息机制,自然就会联想到Handler,我们知道Handler是Android消息机制的上层接口,因此我们在开发过程中也只需要和Handler交互即可,很多人认为Handler的...
下面搜罗了5个Android开发中比较常见的内存泄漏问题及解决办法,分享给大家,一起来看看吧。 一、单例造成的内存泄漏 android的单列大家都喜欢使用。但单例模式的静态特征使得他的生命周期和应用的生命周期一样长...
Handler内存泄漏分析及解决 Handler、Looper、Message、MessageQueue基础流程分析 Android性能优化 ListView详解 RecyclerView和ListView的异同 AsyncTask源码分析 插件化技术 自定义控件 事件分发机制 ANR问题 Art...