Android Handler被弃用,那么以后怎么使用Handler,或者类似的功能

2023-11-08

Android API30左右,Android应用在使用传统写法使用Handler类的时候会显示删除线,并提示相关的方法已经被弃用,不建议使用。

Handler handler = new Handler(){
            @Override
            public void handleMessage(@NonNull Message msg) {
                super.handleMessage(msg);
                switch (msg.what){
                    case 1:
                        String content = String.valueOf(msg.obj);
                        textView.setText(content);
                        break;
                }
            }
        };

Android studio中的显示和建议:

看下官方API关于此处的解释:

 简要说就是如果在实例化Handler的时候不提供Looper, 可能导致操作丢失(Handler 没有预估到新任务并已退出)、App崩溃的bug(Handler有时候创建一个线程,但没有运行的Looper),亦或者race情况下,造成处理错误。

所以作者弃用了这部分内容。

那以后如何用Handler,或者相关功能挺好用的,有没有替代功能呢?

通常,Android 应用程序使用主线程来处理 UI 任务和输入事件。因此,在此主线程上执行任何长时间运行的任务都可能导致应用程序冻结和无响应。 该主线程将 UI 事件或消息收集到队列 ( MessageQueue) 中,然后使用Looper类的实例对其进行处理。默认情况下,主线程已经准备好了Looper 。

但意外总是有的,那应该怎么处理?

1。仍然用Handler

弃用的不是Handler, 而上Handler的两个构造方法:

  • Handler()
  • Handler(Handler.Callback)

上面两个构造方法在某些情况下会发生弃用理由里面的bug,但是,并不是整个Handler类被弃用了,还可以用其他的构造方法来构造Handler对象。

安卓建议采用如下方法来替代:

  • 使用 Executor
  • 明确指定Looper 。
  • 使用Looper.getMainLooper()定位并使用主线程的Looper
  • 如果又想在其他线程,又想要不出bug,请使用new Handler(Looper.myLooper(), callback) 或者 new Handler(Looper.myLooper())两个构造方法。
public Handler(@NonNull Looper looper) {
        throw new RuntimeException("Stub!");
    }

public Handler(@NonNull Looper looper, @Nullable Handler.Callback callback) {
        throw new RuntimeException("Stub!");
    }

2。仍然使用Handler的方法

2.1 在主线程内运行。

val mainHandler = Handler(Looper.getMainLooper()).post {
            System.out.println("Thread : " + Thread.currentThread().name)
        }
/* prints 
I/System.out: Thread : main */

2.2 在当前线程运行Handler

val mainHandler = Handler(Looper.myLooper()).post {
            System.out.println("Thread : " + Thread.currentThread().name)
        }

2.3 明确指出使用某线程的Looper

val handlerThread = HandlerThread("HandlerThread");
handlerThread.start();
val backgroundHandler = Handler(handlerThread.looper).post {
    println("Thread : " + Thread.currentThread().name)
    handlerThread.quitSafely(); 
}
/* prints
I/System.out: Thread : HandlerThread */

2.4 从主线程内新建一个线程handler线程

// Create a handler to execute in the background thread
val backgroundHandler = Handler(handlerThread.getLooper(), Handler.Callback() {
        // Your code logic goes here.
        
        Handler(Looper.getMainLooper()).post {
            System.out.println("Thread : " + Thread.currentThread().name)
            // update UI
        }
        
        return true
    }
})

3。使用 Executor

3.1 在主线程内运行 Executor

val mainExecutor: Executor = ContextCompat.getMainExecutor(this)
        // Execute a task in the main thread
        mainExecutor.execute(Runnable {
            // You code logic goes here.
        })

3.2 新建后台线程运行 Executor

val backgroundExecutor: ScheduledExecutorService = Executors.newSingleThreadScheduledExecutor()
// Execute a task in the background thread.
backgroundExecutor.execute {
    // background code
    backgroundExecutor.shutdown();
}
// Execute a task in the background thread after 5 seconds.
backgroundExecutor.schedule({
    // background code
    backgroundExecutor.shutdown();
}, 5, TimeUnit.SECONDS)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Handler被弃用,那么以后怎么使用Handler,或者类似的功能 的相关文章

  • 如何为ScrollView放置固定图像背景?

    我应该想要滚动视图滚动 而不是背景中的图像 将图像添加到滚动视图框架之前的视图层次结构的较高位置
  • 找不到参数的方法 dependencyResolutionManagement()

    我正在尝试使用老师给我的一个项目 但它显示了一个错误 Settings file Users admin AndroidStudioProjects HTTPNetworking settings gradle line 1 A probl
  • 如何清除所有WebView存储的信息?

    我有一个 Android 浏览器 我可以选择清除缓存 存储 cookie 等 代码如下所示 webView clearCache true webView clearFormData webView clearHistory webView
  • StrictMode 策略违规:我的应用程序中存在 android.os.strictmode.LeakedClosableViolation?

    Android 开发新手 第一次在我的应用程序上尝试 StrictMode 我注意到以下内容 并想知道这是否是我的应用程序或库中的问题 我不太清楚 谢谢你 D StrictMode StrictMode policy violation a
  • android中向sqlite中插入大量数据

    目前 我必须一次向我的 Android 中插入超过 100 亿条数据 然而 内存不足的问题会使程序崩溃 sqlite 插入测试非常简单 只需使用 for 循环生成 sql 插入命令并通过 开始 和 提交 进行包装 private Array
  • SearchView过滤ListView

    我已经实现了搜索视图来过滤我的列表视图项目 当我输入任何文本时 它会过滤列表 但当我退出搜索视图时 它不会返回原始列表项 public class PlacesListAdapter extends ArrayAdapter
  • Android 后退按钮无法与 Flutter 选项卡内的导航器配合使用

    我需要在每个选项卡内有一个导航器 因此当我推送新的小部件时 选项卡栏会保留在屏幕上 代码运行得很好 但是 android 后退按钮正在关闭应用程序而不是运行 Navigator pop import package flutter mate
  • 无法获取log.d或输出Robolectrict + gradle

    有没有人能够将 System out 或 Log d 跟踪从 robolectric 测试输出到 gradle 控制台 我在用Robolectric Gradle 测试插件 https github com robolectric robo
  • android xamarin 中的 reCaptcha

    我想在 Xamarin android 应用程序中实现验证码 我抓住了这个在 Android 中集成 googles reCaptcha 验证 https www c sharpcorner com article how to integ
  • CollapsingToolBarLayout - 状态栏稀松布颜色不改变

    几天前我更新了我的 android studio 并开始使用 CoordinatorLayout 和 CollapsingToolbarLayout 只是尝试一些东西 工具栏稀松布颜色似乎覆盖了状态栏初始颜色和状态栏稀松布颜色 从 xml
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • Google 云端硬盘身份验证异常 - 需要许可吗? (v2)

    我一直在尝试将 Google Drive v2 添加到我的 Android 应用程序中 但无法获得授权 我收到 UserRecoverableAuthIOException 并显示消息 NeedPermission 我感觉 Google A
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • Android Studio - Windows 7 上的 Android SDK 问题

    我对 Google i o 2013 上发布的最新开发工具 Android Studio 有疑问 我已经成功安装了该程序并且能够正常启动 我可以导入现有项目并对其进行编辑 但是 当我尝试单击 SDK 管理器图标或 AVD 管理器图标时 或者
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 如何根据 gradle 风格设置变量

    我想传递一个变量test我为每种风格设置了不同的值作为 NDK 的定义 但出于某种原因 他总是忽略了最后味道的价值 这是 build gradle apply plugin com android library def test andr
  • Android 套接字和 asynctask

    我即将开始制作一个应该充当 tcp 聊天客户端的应用程序 我一直在阅读和阅读 我得出的结论是最好 如果不需要 将我的套接字和异步任务中的阅读器 问题是我不确定从哪里开始 因为我是 Android 新手 这至少对我来说是一项艰巨的任务 但据我
  • 在activity_main.xml中注释

    我是安卓新手 据我所知 XML 中的注释与 HTML 中的注释相同 使用 形式 我想在 Android 项目的 Activity main xml 配置文件中写一些注释 但它给了我错误 值得注意的是 我使用的是 Eclipse 但目前 我直
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 如何将 google+ 登录集成到我的 Android 应用程序中?

    大家好 实际上我需要通过我的应用程序从 google 登录人们 现在我阅读了 google 上的文档 其中指出 要允许用户登录 请将 Google Sign In 集成到您的应用中 初始化 GoogleApiClient 对象时 请求 PL

随机推荐

  • 微服务多模块:Springboot+Security+Redis+Gateway+OpenFeign+Nacos+JWT (附源码)仅需一招,520彻底拿捏你

    可能有些人会觉得这篇似曾相识 没错 这篇是由原文章进行二次开发的 前阵子有些事情 但最近看到评论区说原文章最后实现的是单模块的验证 由于过去太久也懒得验证 所以重新写了一个完整的可以跑得动的一个 OK 回到正题 以下是真正对应的微服务多模块
  • python习题及答案/4.16

    文章目录 1 从键盘输入两个数 求它们的和并输出 2 从键盘输入三个数到a b c中 按公式值输出 3 输出 Python语言简单易学 4 使用函数求特殊a串数列和 5 使用函数求素数和 6 使用函数统计指定数字的个数 1 从键盘输入两个数
  • 以太坊学习笔记(三)——搭建以太坊私链

    以太坊私链的搭建可以直接通过下载程序进行安装 也可以通过编译源码安装 本文介绍通过编译源码进行安装 编译源码 1 准备环境 我们下载的是go语言的源码 首先需要正确的安装go语言环境 如何正确安装go语言环境 大家可以去网上找教程 2 下载
  • AndroidO audio系统之AudioPolicyService分析(三)

    1 AudioPolicyService基础 AudioPolicy在Android系统中主要负责Audio 策略 相关的问题 它和AudioFlinger一起组成了Android Audio系统的两个服务 一个负责管理audio的 路由
  • QStringList 常用方法

    QStringList类 常用方法 定义一个字符串链表 QStringList weekList 往链表中添加元素 weekList lt lt 星期一 lt lt 星期二 lt lt 星期三 lt lt 星期四 weekList lt l
  • 麻雀算法SSA优化LSTM超参数

    前言 LSTM 航空乘客预测单步预测的两种情况 简单运用LSTM 模型进行预测分析 加入注意力机制的LSTM 对航空乘客预测采用了目前市面上比较流行的注意力机制 将两者进行结合预测 多层 LSTM 对航空乘客预测 简单运用多层的LSTM 模
  • Shapley Values

    今天来学习一下Shapley Values 先上概念 以及研究背景 borrowed from Wikipedia The Shapley value is a solution concept in cooperative game th
  • 环形链表之快慢指针

    环形链表 前言 一 案例 1 环形链表 2 环形链表II 二 题解 1 环形链表 2 环形链表II 3 源码 4 寻找入环点的数学解法 总结 参考文献 前言 对于环形链表 通过快慢指针 如果存在环 这这两个指针一定会相遇 这是一种经典的判断
  • 服务器虚拟化的七大好处

    将服务器物理资源抽象成逻辑资源 让一台服务器变成几台甚至上百台相互隔离的虚拟服务器 我们不再受限于物理上的界限 而是让CPU 内存 磁盘 I O等硬件变成可以动态管理的 资源池 从而提高资源的利用率 简化系统管理 实现服务器整合 让IT对业
  • 遇到的问题----java.lang.reflect.InvocationTargetException

    发现问题 因为是从servlet中反射调用方式 所以只要是在调用反射方法中出现的任何错误都会包此错误 关键在于看下面的错误报告 如下图 解决问题 然后经过一点点的排查发现 namespace com bjsxt mapper Employe
  • 将List中的某一个元素移动到首位或指定位置

    List集合的特点是有序 有下标 可重复的 问题场景 从数据库查询多条数据放到List集合中 但突然想把集合中某一条数据向上移动 放到某一条数据后边 此时你又不能改变从数据库中查询结果的顺序 所以只能对集合进行处理 方法一 使用 Colle
  • How to Control Power Switch Rush Current

    原文链接 https community cadence com cadence blogs 8 b lp posts how to control power switch rush current While there are mul
  • mysql列转行

    原表select from test table 列转行select sheng substring index substring index b shi a help topic id 1 1 as shi from mysql hel
  • C#怎么测试静态方法?我给出了2种方案

    问题 假设有一个方法需要判断当前小时范围 代码如下 public class Class1 public bool SomeMethod var hour DateTime Now Hour if hour gt 9 hour lt 12
  • 遥感影像深度学习样本对制作教程3——从GEE下载训练数据

    关注公众号GeodataAnalysis 回复20230505获取示例数据和代码 这三章的代码都放在一起 上手运行一下代码更容易弄懂 遥感数据多种多样 存储格式各异 处理起来很麻烦 比如很多MODIS数据都是采用HDF格式存储的 在制作深度
  • 模板编程:模板完全特例化

    模板有类模板和函数模板 类模板存在偏特例化 和完全特例化 类模板 类模板完全特例化 类模板偏特化 函数模板只有完全特例化 函数模板完全特特化重点 需要在特例化版本前面加template lt gt 告诉编译器 这个函数是对模板进行特例化 特
  • stm32F1的 PA13/PA14/PA15/PB3/PB4 作为普通引脚使用

    代码链接 https blog csdn net Mark md article details 107411081
  • AS3 通过方法名称 进行调用

    package public class ObjectBinder public var targetInstance public function ObjectBinder targetInstance this targetInsta
  • 运维常用工具

    操作系统 Centos Ubuntu Redhat suse Freebsd 网站服务 nginx apache lighttpd php tomcat resin 数据 库 MySQL MariaDB PostgreSQL DB中间件 m
  • Android Handler被弃用,那么以后怎么使用Handler,或者类似的功能

    Android API30左右 Android应用在使用传统写法使用Handler类的时候会显示删除线 并提示相关的方法已经被弃用 不建议使用 Handler handler new Handler Override public void