我知道这个问题已经被问过很多次,但我得到的所有答案对我来说都不是很清楚。
我想实现一个文件删除过程。我发现要完成此类工作,建议在单独的线程中运行所有进程。
为此,我可以使用 AsyncTask
、Handler
和 Thread
。 AsyncTask
似乎是一个很好的解决方案。但是,AsyncTask
是为小型任务设计的。 (当我尝试删除长度超过 1G 的文件时,AsyncTask
崩溃或不执行 onPostExecute
。
其他线程处理程序(Thread
、Runnable
...)无法管理 UI(更新 UI 或显示进度)。
我的问题是什么是适合长任务的线程处理程序以及如何使用它管理 UI。
首先,如果您需要在主线程之外执行工作,但仅在用户与您的应用交互时执行,那么您应该创建一个新线程,否则使用服务。
现在,您可以使用 AsyncTask 做的所有事情,您也可以使用 Thread(+ Handler) 来完成。但是 AsyncTask 使开发人员的工作更容易,因为它旨在将工作线程与主线程(调用线程)进行通信。现在,如果你使用 Hanlder 你还可以将工作线程与调用线程通信(注意调用线程不一定是主线程,它可以是两个工作线程之间的通信),如果调用线程是主线程,你最好使用 AsyncTask。
据我所知,它是这样的:
- 如果您需要运行与 UI 线程通信的短任务,请使用 AsyncTask
- 使用Thread 和Handler 运行需要工作线程和主线程(调用线程)之间通信的较长任务
- 使用Thread、Handler 和Looper(或HandlerThread,这是用于启动一个线程的类有一个 Looper)用于需要在工作线程和调用者线程(不是主线程)之间进行通信的较长任务。
- 将 IntentService 用于不需要用户交互且只需要一个工作线程的较长任务。