AsyncTask,Handler,Thread ......选择哪一个

时间:2014-05-21 00:38:37

标签: java android multithreading android-asynctask

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

我想实现文件删除过程。我发现要做这种工作,建议在分离的线程中运行所有进程。

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

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

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

4 个答案:

答案 0 :(得分:4)

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

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

据我所知,它是这样的:

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

答案 1 :(得分:0)

对我来说最好的是Asynctask,因为结构定义明确,你可以知道何时运行线程以及何时显示结果。

答案 2 :(得分:0)

http://masl.cis.gvsu.edu/2010/04/05/android-code-sample-asynchronous-http-connections/

关于使用上述处理程序的好文章。

使用处理程序删除:

创建一个可以完成三件事的runnable:

删除档案

获取消息并发送成功

获取消息并发送失败

使用一些框架来管理线程或使用并发包,发布runnable,它将执行文件Del off主线程。处理程序回调将是msg成功或msg失败,将在主线程wherview控制器上处理。

答案 3 :(得分:0)

查看Needle,你可以忘记Handler和AsyncTasks。 Needle是一款开源,简单但功能强大的Android多线程库。有了它,你可以说:

Needle.onMainThread().execute(new Runnable() {
    @Override
    public void run() {
        // e.g. change one of the views
    }
});

Needle.onBackgroundThread().execute(new UiRelatedTask<Integer>() {
    @Override
    protected Integer doWork() {
        int result = 1+2;
        return result;
    }

    @Override
    protected void thenDoUiRelatedWork(Integer result) {
        mSomeTextView.setText("result: " + result);
    }
});
  • 非常简单的API
  • 固定线程池大小
  • 可自定义的线程池大小
  • 支持UI交互(“工作然后在UI线程上使用结果”)
  • android 1.5 +
  • 在所有平台版本上的行为相同

在GitHub上查看:https://github.com/ZsoltSafrany/needle