• 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方法,确保广播接收器被正确注销,从而避免内存泄漏。

  • 相关阅读:
    java基础(2)
    Visual Studio 中的键盘快捷方式大全
    心中有码,自然快乐
    leetcode 8. 字符串转换整数 (atoi)
    5 h0255. 迷宫问题,6 h0253. 鸣人和佐助(广度优先搜索)
    vue目录树的封装
    LeetCode 206. 反转链表(迭代+递归)
    Stateflow快速入门系列(-):构造并运行 Stateflow 图
    信奥中的数学:唯一分解定理(算术基本定理)
    全网最牛自动化测试框架系列之pytest(9)-标记用例(指定执行、跳过用例、预期失败)
  • 原文地址:https://blog.csdn.net/chezabo6116/article/details/138840874