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

这篇具有很好参考价值的文章主要介绍了Android Handler被弃用,那么以后怎么使用Handler,或者类似的功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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中的显示和建议:

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

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

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

 简要说就是如果在实例化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文章来源地址https://www.toymoban.com/news/detail-419825.html

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)

到了这里,关于Android Handler被弃用,那么以后怎么使用Handler,或者类似的功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vscode | linux | c++ intelliense 被弃用解决方案

    每日一句,vscode用的爽是爽,主要是可配置太强了。如果也很会研究,可以直接去咸鱼接单了 废话少说,直接整。 用着用着说是c++ intelliense被弃用,很多辅助功能无法使用,像查看定义、查看引用、函数跳转、智能提示…… 归根结底,还是太菜了,但真的很需要这些辅助啊

    2024年02月12日
    浏览(49)
  • Resthighlevelclient被弃用后,ES 8.x 最新用法 java api

    一、ES 8.x 整合springBoot 1、导入依赖 2、创建 ElasticsearchClient 二、ES java api 1、搜索 2、单个插入(更新)文档 3、批量插入(更新)文档

    2024年02月14日
    浏览(43)
  • Python错题集-7:DeprecationWarning: Conversion of an array with ndim(被弃用警告)

    DeprecationWarning: Conversion of an array with ndim 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)   X[i] = np.random.normal(loc=Ex, scale=np.abs(Enn), size=1) DeprecationWarning: Conversion of an array with ndim  是一个警告,通常出

    2024年04月09日
    浏览(46)
  • iOS中获取MCC和MNC的方法及iOS 16中CTCarrier被弃用的替代方案

    一、使用公共API获取MCC和MNC 在iOS中,我们可以使用CoreTelephony框架来获取用户的移动国家代码(MCC)和移动网络代码(MNC)。具体操作步骤如下: 在Xcode项目中,点击项目目标,进入“General”选项卡,在“Frameworks, Libraries, and Embedded Content”下点击“+”按钮,搜索并添加 Cor

    2024年02月11日
    浏览(107)
  • Elasticsearch RestHighLevelClient 已标记为被弃用 它的替代方案 Elasticsearch Java API Client 的基础教程及迁移方案

    在Elasticsearch7.15版本之后,Elasticsearch官方将它的高级客户端 RestHighLevelClient 标记为弃用状态。同时推出了全新的Java API客户端 Elasticsearch Java API Client ,该客户端也将在Elasticsearch8.0及以后版本中成为官方推荐使用的客户端。 Elasticsearch Java API Client 支持除 Vector tile search API 和

    2024年01月16日
    浏览(40)
  • Elasticsearch8.x版本中RestHighLevelClient被弃用,新版本中全新的Java客户端Elasticsearch Java API Client中常用API练习

    在Es7.15版本之后,es官方将它的高级客户端RestHighLevelClient标记为弃用状态。同时推出了全新的java API客户端Elasticsearch Java API Client,该客户端也将在Elasticsearch8.0及以后版本中成为官方推荐使用的客户端。 Elasticsearch Java API Client支持除Vector title search API和Find structure API之外的所有

    2023年04月08日
    浏览(52)
  • 【Android】怎么使用一个ViewModel用在多个Activity或者Fragment中

    项目需求 在多个Activity或者Fragment中使用同一个ViewModel 需求实现 1.使用ActivityScope或FragmentScope 想在一个Activity或Fragment中共享ViewModel实例,可以使用ActivityScope或FragmentScope。这两种范围会根据它们所绑定的Activity或Fragment自动管理ViewModel实例的生命周期。 例如,创建一个继承自

    2024年02月15日
    浏览(41)
  • Android中正确使用Handler的姿势

    在Android中,Handler是一种用于在不同线程之间传递消息和任务的机制。以下是在Android中正确使用Handler的一些姿势: 1. 在主线程中创建Handler对象 在Android中,只有主线程(也称为UI线程)可以更新UI。因此,如果您需要在后台线程中执行某些任务并更新UI,则需要使用Handler将任

    2024年02月11日
    浏览(46)
  • 适配器模式那么强大,该怎么使用呢?

    适配器模式是一种常用的设计模式,它可以将两个不兼容的接口进行转换,从而使它们之间可以进行交互。在业务开发中,我们经常需要将不同的系统或服务进行整合,而这些系统或服务往往有着不同的接口和数据格式。适配器模式提供了一种解决方案,可以帮助我们轻松地

    2024年02月08日
    浏览(46)
  • 【flutter】使用permission_handler配置android和 iOS的权限

    flutter在pub.flutter-io.cn插件库中有很多的关于权限配置的插件,但是就我个人而言,比较推荐使用permission_handler这个插件。当我们打开permission_handler时候,往往新手小白会因为它的官网文档而弄的一头雾水,权限配置往往涉及到android和ios两个方向的相关知识,有可能大多数人就

    2024年02月12日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包