• DiagnosisPrintDialog 使用广播导致关闭不了的问题


    这段代码是一个名为DiagnosisPrintDialog的Android弹出窗口类,用于显示诊断打印和数据上传的选项。它包含了各种UI元素的初始化、事件监听以及数据同步和导出的相关逻辑。从代码来看,存在内存泄漏的风险,主要在于广播接收器的使用上:
    在initView方法中,创建了一个BroadcastReceiver实例uploadStatusBroadcastReceiver,并注册了监听IFlashApplication.TEST_UPLOAD_STATUS动作的意图过滤器。当弹出窗口关闭时,应当取消注册这个广播接收器以防止内存泄漏。但是,disMissWindow方法中虽然有注销广播接收器的代码,但只有在弹出窗口关闭时才会调用此方法。如果弹出窗口没有正确关闭或者在其他异常情况下,uploadStatusBroadcastReceiver可能不会被注销,导致Activity无法正常结束,从而引起内存泄漏。
    为了修复这个问题,确保在适当的时候调用disMissWindow方法,或者在onDismiss回调中注销广播接收器。此外,考虑使用LocalBroadcastManager的unregisterReceiver方法来确保在不需要接收广播时及时清理资源

    要修复内存泄漏问题,可以在DiagnosisPrintDialog类中添加一个onDismiss回调,确保在弹出窗口关闭时取消注册广播接收器。以下是修改后的DiagnosisPrintDialog类:

    public class DiagnosisPrintDialog extends PopupWindow {

        // ...其他代码...

        @Override
        public void onDismiss() {
            super.onDismiss();
            disMissWindow();
        }

        private void disMissWindow() {
            if (uploadStatusBroadcastReceiver != null) {
                LocalBroadcastManager.getInstance(mContext).unregisterReceiver(uploadStatusBroadcastReceiver);
                uploadStatusBroadcastReceiver = null;
            }
        }

        // ...其他代码...
    }
    这样,当弹出窗口被关闭时,onDismiss回调会被触发,进而调用disMissWindow方法,确保广播接收器被正确注销,从而避免内存泄漏。

  • 相关阅读:
    并发编程之JMM&synchronized&volatile详解
    Spring Data JPA 原理与实战第五天 Jackon相关使用
    MobLink Android端快速集成文档
    FreeRTOS深入教程(任务创建的深入和任务调度机制分析)
    C++ 虚函数表
    提高企业研发效率核心关键在打造组合应用建设
    基于php的旅游小型网站
    第七章练习题
    vscode设置tab或者enter补全代码
    【网络编程】套接字编程——TCP通信
  • 原文地址:https://blog.csdn.net/chezabo6116/article/details/138840874