`

Handler内存泄露与解决

 
阅读更多

直接创建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 Handler内存泄漏详解及其解决方案

    Android Handler内存泄漏详解及其解决方案 在 Android 开发过程中,我们可能会遇到过令人奔溃的 OOM 异常,这篇文章主要介绍了 Android Handler 内存泄漏详解及其解决方案,具有一定的参考价值,感兴趣的小伙伴们...

    AndroidHandler内存泄漏详解及其解决方案.docx

    #### 三、Handler 内存泄漏解决方法 为了避免上述问题,可以采取以下几种方式来解决内存泄漏: 1. **使用静态内部类**:将Handler定义为静态内部类,这样它就不会持有Activity的引用。 2. **使用WeakReference**:...

    解决Android使用Handler造成内存泄露问题

    Android中Handler造成内存泄露问题解决方法 Android中使用Handler可能会造成内存泄露的问题,这是因为Handler对象会隐式地持有一个外部类对象的引用,使得Activity无法被回收。这种情况下,出现了内存泄露的问题,...

    详解Android使用Handler造成内存泄露的分析及解决方法

    Android 中 Handler 造成内存泄露的分析及解决方法 什么是内存泄露? 在 Java 中,使用有向图机制,通过 GC 自动检查内存中的对象(什么时候检查由虚拟机决定),如果 GC 发现一个或一组对象为不可到达状态,则将...

    Android中Handler引起的内存泄露问题解决办法

    在本文中,我们将深入探讨一个特定的内存泄露场景:由Handler引起的内存泄露,以及如何解决这个问题。 首先,我们需要理解Handler在Android中的作用。Handler是Android异步消息处理机制的关键组件,它与Looper和...

    Handler对象中使用匿名内部类或非静态内部类正确地释放消息避免内存泄漏或增加Native内存

    然而,不当使用Handler,尤其是结合匿名内部类或非静态内部类,可能导致内存泄漏和Native内存增加,这对应用性能和稳定性造成负面影响。 首先,我们要理解内存泄漏的概念。内存泄漏是指程序中已分配的内存没有被...

    浅谈Android应用的内存优化及Handler的内存泄漏问题

    对于Handler的内存泄漏问题,主要是因为Handler中的Message和Looper与Activity有强引用关系,导致Activity无法正常销毁。为了解决这个问题,可以采取以下措施: 1. 使用静态Handler并配合弱引用:创建一个静态的...

    iOS WKWebView中MessageHandler内存泄漏问题的完美解决过程

    本文将详细讲解如何解决iOS WKWebView中MessageHandler内存泄漏的问题。 首先,我们需要理解问题的根源。当我们在`WKUserContentController`中添加`ScriptMessageHandler`,例如`addScriptMessageHandler:self name...

    Handler使用

    本篇文章将深入探讨`Handler`的使用方法,包括其基本概念、工作原理以及如何避免内存泄露和实现定时任务。 ### 1. Handler基本概念 `Handler`是Android消息处理机制的核心部分,它与`Looper`和`Message`共同协作,...

    Kotlin中的handler如何避免内存泄漏详解

    Handler内存泄漏的常见原因是在Activity中创建了一个匿名内部类的Handler实例,这个内部类隐式持有了对外部Activity的强引用。当Activity被finish()但Handler仍有Message待处理时,Handler、Message和Activity之间...

    Android内存泄漏解决方案

    ### Android内存泄漏解决方案 #### 一、概述 在Android应用开发过程中,内存管理是一个非常重要的环节。不当的内存管理不仅会导致应用性能下降,甚至可能导致应用崩溃。为了有效地管理和避免内存泄漏,开发者需要...

    CDC导致的内存泄露问题总结

    除了上述的GDI资源管理,还可以借助智能指针(如`auto_ptr`或`unique_ptr`)来帮助管理内存,或者使用内存泄漏检测工具(如Valgrind、LeakSanitizer等)来辅助定位和修复内存泄露问题。 总的来说,对于GDI内存泄露...

    android性能优化之内存泄露

    本文将深入探讨Android开发中常见的内存泄露类型及其解决方案,并通过具体案例进行分析。 #### 二、Android内存管理基础知识 在讨论内存泄露之前,我们需要了解一些基本概念。Android应用进程通常被分配一定量的...

    jquery 内存泄露bug

    标题 "jquery 内存泄露bug" 指的是在使用jQuery库进行JavaScript编程时可能出现的一种常见问题,即内存无法正常释放,导致应用占用过多内存,影响性能甚至可能导致浏览器崩溃。这个问题通常与对象引用、事件监听器和...

    android内存泄露测试

    内存泄露可能由多种原因引起,包括但不限于对象引用未正确管理、静态集合的过度使用、Handler和Runnable的错误处理等。在Android开发中,主要依靠以下工具进行内存泄露检测: - **MAT(Memory Analyzer Tool)**:...

    Android Handler leak分析及解决办法详解

    Android Handler泄漏分析及解决办法详解 Handler泄漏是Android开发中常见的问题之一,它会导致应用程序的性能下降、内存泄漏和Crash等问题。本文将对Handler泄漏进行详细的分析,并提供相应的解决方案。 Handler...

    常见的内存泄漏原因及解决方法 - 简书1

    本文将深入探讨内存泄漏的原因以及相应的解决策略。 1. 单例模式引起的内存泄漏 单例模式是一种常用的创建对象的方式,确保一个类只有一个实例并提供全局访问点。然而,如果单例持有长时间存在的引用,比如...

    Android内存泄漏案例分析

    在本次技术公开课中,讲师张权威将深入剖析Android平台下的内存泄漏案例,通过对一个具体案例的分析,展示内存泄漏的形成原因、诊断流程以及解决方案。 首先,案例中提到当连续多次打开应用时,界面出现卡顿,并且...

    内存泄露从入门到精通三部曲之常见原因与用户实践1

    Handler的不当使用是另一个常见的内存泄露原因。Handler通常与消息队列和Looper关联,如果Handler发送的消息未被处理,它会持有Activity的引用,导致Activity无法被释放。为防止这种情况,应确保Handler与Activity的...

Global site tag (gtag.js) - Google Analytics