Android,Threads - 处理程序/ asynctask

时间:2011-07-24 16:45:39

标签: android multithreading android-asynctask handlers

通过书籍和线程学习Android是一个菜鸟我看到书中有三种主要方法:

  • 通过消息传递处理程序
  • 通过邮寄处理程序
  • 的AsyncTask

所有3个似乎都很好,我的问题是:
是否有特定时间使用上述其中一种?或者这是个人偏好吗?

编辑:
如果不是个人喜好,请举例说明何时使用其中一个(如果不是其他链接)

因为我计划运行多个线程(例如,一个用于总应用运行时间,一个用于在应用中选择应答之前的时间等,一个用于移动背景图像等)并且想要知道选择哪个。我可以使用这3种方法中的任何一种来完成我想要的功能,所以很困惑为什么有3种方法可以用任何一种方法完成。

谢谢!

4 个答案:

答案 0 :(得分:2)

Handler是一种非常基本的方法,允许您在不同的线程(通常是UI线程)上执行某些代码。它没有告诉你如何运行你的线程,你可以自由地做任何你想做的事情。如果您有明确的消息,我会选择handleMessage方法。那就是你需要发送和接收一些数据。如果您只是需要做某事,可以使用Runnable。但是,这两种方法都是可用的,并且通常会选择偏好。

AsyncTask是更高级别的概念,它使用处理程序。如果您使用它,您将不必自己处理线程。您的异步代码将通过线程池执行并由框架控制。您将有两种方法可以在UI线程(onPostExecuteonProgressUpdate)上执行代码。

简而言之,对于您使用多个线程执行的大多数事情,请选择AsyncTask,这将免除您自己处理线程管理的需要。如果您必须拥有自己的线程,那么请使用处理程序。但请注意,还有其他情况需要使用处理程序。例如,使用Messenger。我使用onProgressUpdate时的情况还不够。在这种情况下,我也会使用来自doInBackground的处理程序。

答案 1 :(得分:1)

AsynTasks可能最适合复杂的任务,比如当你需要大量的处理和大量的消息传递时。你也可以通过Handler实现它们,但就个人而言,你的代码会变得有点混乱。

答案 2 :(得分:1)

处理程序:绑定到创建它的线程。 Queue / Enqueue在消息队列中的任务。当它将消息排入队列时,它会将其交给另一个创建消息的线程。把它想象成线程的代理。它负责发送给它的请求并相应地委托它们。

发布/消息:如上所述,它只是处理程序发布(排队)或消息(排队)。

Asynctask:一个线程主要用于需要在后台完成的小任务,并根据其进度更新UI(想想加载栏或下载; UI正在使用该进度进行更新)。

答案 3 :(得分:0)

查看Needle,你可以忘记处理程序和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