2

我是一个通过一本书学习 Android 的菜鸟,对于线程,我看到书中解释了 3 种主要方法:

  • 通过消息传递的处理程序
  • 通过邮寄处理程序
  • 异步任务

所有 3 似乎都不错,我的问题是:
您是否有特定时间使用上述其中一种?还是个人喜好?

编辑:
如果不是个人喜好,请给我一个例子,说明何时使用一个(如果不是另一个)(即使是链接也将不胜感激)

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

谢谢!

4

4 回答 4

2

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

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

简而言之,AsyncTask为大多数使用多线程执行的操作选择它将使您无需自己处理线程管理。如果您必须只拥有自己的线程,则使用处理程序。但是请注意,在其他情况下您必须使用处理程序。例如,与Messenger. 我也有使用onProgressUpdate不足的情况。在这种情况下,我也会从doInBackground.

于 2011-07-24T17:22:07.350 回答
1

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

于 2011-07-24T16:58:55.953 回答
1

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

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

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

于 2011-07-24T16:59:35.803 回答
1

查看 Needle,您可以忘记 Handlers 和 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 线程上使用结果”)
  • 安卓 1.5+
  • 在所有平台版本上表现相同

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

于 2014-08-19T13:43:58.053 回答