• Android异步之旅:探索HandlerThread


    前言

    当我们在Android应用程序中需要执行一些耗时的任务,比如网络请求、数据库操作或者其他需要在后台线程中执行的操作时,我们通常会使用异步任务来完成这些任务。在Android中,有多种方式来实现异步操作,其中之一就是使用HandlerThread。

    在本篇博客中,我们将探索HandlerThread,了解它的工作原理以及如何在Android应用程序中使用它来进行异步操作。

    1.介绍HandlerThread


         HandlerThread是Android中的一个类,它继承自Thread类,并且内部包含一个Looper和一个Handler。这使得它可以方便地在后台线程中执行任务,并且可以通过Handler与UI线程进行通信。(Handler+Thread

    2.HandlerThread的工作原理


    HandlerThread的工作原理是基于线程和消息循环的机制。当我们创建一个HandlerThread实例并启动它时,它会在后台创建一个新的线程,并在这个线程中创建一个Looper。这个Looper会一直循环处理消息队列中的消息,直到调用quit()方法停止循环。

    我们可以通过HandlerThread的getLooper()方法获取到这个Looper,然后利用它创建一个Handler。这个Handler可以用来发送消息到HandlerThread中执行任务,也可以用来与UI线程进行通信。

    当我们发送消息到HandlerThread中时,这个消息会被添加到HandlerThread的消息队列中,然后由Looper循环处理这些消息,并在Handler的handleMessage()方法中执行相应的任务。

    总的来说,HandlerThread通过线程和消息循环的机制,实现了在后台线程中执行任务并与UI线程进行通信的功能。

    3.为什么使用HandlerThread?


    相比于其他的异步操作方式,使用HandlerThread有以下几个优点:

    1.将loop运行在子线程中处理,减轻了主线程的压力,使主线程更流畅

    2.串行执行,开启一个线程起到多个线程的作用

    3.有自己的消息队列,不会干扰UI线程

    缺点:

    1.由于每一个任务队列逐步执行,一旦队列耗时过长,消息延时

    2.对于IO等操作,线程等待,不能并发

    4.如何使用HandlerThread?


    首先,我们需要创建一个HandlerThread的实例,并启动它。然后,我们可以通过HandlerThread的getLooper()方法获取到Looper,再利用这个Looper创建一个Handler。这样,我们就可以在HandlerThread中使用Handler来发送消息和执行任务。

    下面是一个简单的示例代码:

    1. public class MainActivity2 extends AppCompatActivity {
    2.   private HandlerThread handlerThread;
    3.   private Handler handler;
    4.   @Override
    5.   protected void onCreate(Bundle savedInstanceState) {
    6.       super.onCreate(savedInstanceState);
    7.       setContentView(R.layout.activity_main2);
    8.       // 创建并启动HandlerThread
    9.       handlerThread = new HandlerThread("MyHandlerThread");
    10.       handlerThread.start();
    11.       // 获取HandlerThread的Looper并创建Handler
    12.       handler = new Handler(handlerThread.getLooper()) {
    13.           //设置消息处理
    14.           @Override
    15.           public void handleMessage(@NonNull Message msg) {
    16.               //super.handleMessage(msg);
    17.               switch (msg.what) {
    18.                   case 1:
    19.                       // 通过主线程Handler.post方法进行在主线程的UI更新操作
    20.                       handler.post(new Runnable() {
    21.                           @Override
    22.                           public void run() {
    23.                               Log.e("xxx","成功");
    24.                           }
    25.                       });
    26.                       break;
    27.               }
    28.           }
    29.       };
    30.       send();
    31.   }
    32.   void send(){
    33.       Message msg = Message.obtain();
    34.       msg.what = 1; //消息的标识
    35.       msg.obj = "A"; // 消息的存放
    36.       // b. 通过Handler发送消息到其绑定的消息队列
    37.       handler.sendMessage(msg);
    38.   }
    39.   // 在Activity销毁时结束HandlerThread
    40.   @Override
    41.   protected void onDestroy() {
    42.       super.onDestroy();
    43.       handlerThread.quit();
    44.   }
    45. }

  • 相关阅读:
    无涯教程-JavaScript - LOG函数
    安全测试:文件上传漏洞检测
    Linux常用命令知识点大全(1)
    Maven 知识点总结
    【Vue】Node.js的下载安装与配置
    56、MQ(异步通讯的的缺点/优点)
    Stream流学习记录
    4 Spring ApplicationListener 问题版
    掷骰子的多线程应用程序2基于互斥量的线程同步(复现《Qt C++6.0》)
    yolo5 onnx2rknn 瑞芯微香橙派 rk3588
  • 原文地址:https://blog.csdn.net/weixin_63357306/article/details/134559098