java - AsyncTask、Handler、Thread……选哪个

标签 java android multithreading android-asynctask

<分区>

我知道这个问题已经被问过很多次,但我得到的所有答案对我来说都不是很清楚。

我想实现一个文件删除过程。我发现要完成此类工作,建议在单独的线程中运行所有进程。

为此,我可以使用 AsyncTaskHandlerThreadAsyncTask 似乎是一个很好的解决方案。但是,AsyncTask 是为小型任务设计的。 (当我尝试删除长度超过 1G 的文件时,AsyncTask 崩溃或不执行 onPostExecute

其他线程处理程序(ThreadRunnable...)无法管理 UI(更新 UI 或显示进度)。

我的问题是什么是适合长任务的线程处理程序以及如何使用它管理 UI。

最佳答案

首先,如果您需要在主线程之外执行工作,但仅在用户与您的应用交互时执行,那么您应该创建一个新线程,否则使用服务。

现在,您可以使用 AsyncTask 做的所有事情,您也可以使用 Thread(+ Handler) 来完成。但是 AsyncTask 使开发人员的工作更容易,因为它旨在将工作线程与主线程(调用线程)进行通信。现在,如果你使用 Hanlder 你还可以将工作线程与调用线程通信(注意调用线程不一定是主线程,它可以是两个工作线程之间的通信),如果调用线程是主线程,你最好使用 AsyncTask。

据我所知,它是这样的:

  • 如果您需要运行与 UI 线程通信的短任务,请使用 AsyncTask
  • 使用ThreadHandler 运行需要工作线程和主线程(调用线程)之间通信的较长任务
  • 使用ThreadHandlerLooper(或HandlerThread,这是用于启动一个线程的类有一个 Looper)用于需要在工作线程和调用者线程(不是主线程)之间进行通信的较长任务。
  • IntentService 用于不需要用户交互且只需要一个工作线程的较长任务。

关于java - AsyncTask、Handler、Thread……选哪个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23772171/

相关文章:

java - 如何在 Base 64 和 Base64url 编码之间进行选择

android - 如何从 C++ 代码请求 Android NDK 相机权限?

java - 当其他线程访问同步块(synchronized block)时,一个线程等待多长时间?

c++ - 使用事件同步线程

java - 字符串无法识别为空格或空

java - 如何在没有名称的android中解析json数组?

android - Jetpack compose Box 中的等宽和等高

wpf - 当前调度程序工作时的多线程 MVVM 更新值

java - 矩阵数组相乘 - 如何避免冗余

java - 如何将文本写入Android外部存储上的文件?