IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 【Android开发】 Handler做消息发送与异步处理遇到的坑 -> 正文阅读

[移动开发]【Android开发】 Handler做消息发送与异步处理遇到的坑

Handler class should be static or leaks might occur

在Android线程通信中,常用的方法就是创建一个Message(android.os.Message) 对象,并将它的what字段指定对应值,调用HandlersendMessage() 方法将这个Message发送出去。代码如下

  val handler = object : Handler() {

        val TEST = 1

        override fun handleMessage(msg: Message) {
            when (msg.what) {
                TEST -> {
                    TODO()
                }
            }
        }
    }

大部分的教材都会使用这个方法,但是在编程中,我们会发现这样的代码会存在几个问题

  1. Handler class should be static or leaks might occur

This Handler class should be static or leaks might occur (anonymous android.os.Handler)

这是因为Handler在Android中用于消息的发送与异步处理,常常在Activity中作为一个匿名内部类来定义,此时Handler会隐式地持有一个外部类对象(通常是一个Activity)的引用。当Activity已经被用户关闭时,由于Handler持有Activity的引用造成Activity无法被GC回收,这样容易造成内存泄露。

解决方法:将其定义成一个静态内部类(此时不会持有外部类对象的引用),在构造方法中传入Activity并对Activity对象增加一个弱引用,这样Activity被用户关闭之后,即便异步消息还未处理完毕,Activity也能够被GC回收,从而避免了内存泄露。

	val handler = MyHandler(this)

    class MyHandler(activity: Activity) : Handler() {
        private var reference: WeakReference<Activity>? = null
        init {
            reference = WeakReference<Activity>(activity)
        }
        override fun handleMessage(msg: Message) {
            if (reference?.get() == null) {
                return
            } else {
                when (msg.what) {
                    0 -> {
                        TODO()
                    }
                }
            }
        }
    }
  1. ‘constructor Handler()’ is deprecated

'constructor Handler()' is deprecated. Deprecated in Java

我们进入到Handler.java文件中,会发现无参构造函数已经被deprecated了

    @Deprecated
    public Handler() {
        this(null, false);
    }

官方给出了存在的隐患

     * If this thread does not have a looper, this handler won't be able to receive messages
     * so an exception is thrown.

被弃用的理由

     * @deprecated Implicitly choosing a Looper during Handler construction can lead to bugs
     *   where operations are silently lost (if the Handler is not expecting new tasks and quits),
     *   crashes (if a handler is sometimes created on a thread without a Looper active), or race
     *   conditions, where the thread a handler is associated with is not what the author
     *   anticipated. Instead, use an {@link java.util.concurrent.Executor} or specify the Looper
     *   explicitly, using {@link Looper#getMainLooper}, {link android.view.View#getHandler}, or
     *   similar. If the implicit thread local behavior is required for compatibility, use
     *   {@code new Handler(Looper.myLooper())} to make it clear to readers.

解决方法

  • 使用Handler(@NonNull Looper looper)
  • 使用Handler(@NonNull Looper looper, @Nullable Callback callback)
	val handler = Handler(Looper.getMainLooper())

    val handler = Handler(Looper.getMainLooper(), object : Handler.Callback {
        override fun handleMessage(msg: Message): Boolean {
            TODO("Not yet implemented")
        }
    })

	// lambda
	val handler = Handler(Looper.getMainLooper()
    ) { TODO("Not yet implemented") }
    
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-12 16:42:49  更:2021-08-12 16:43:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 4:02:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码