处理程序、可运行线程和线程之间有什么区别?

处理程序、可运行线程和线程之间有什么区别?

当我在使用Android工作时,我需要一些东西在后台运行。我使用线程来运行它。通常我会编写一个扩展 Thread 并实现 run 方法的类。

我还看到一些例子,这些例子将可运行并传递到可运行线程中。

然而,我仍然感到困惑。有人可以给我一个明确的解释吗?

  1. 如果可以在 Thread 的 run 方法中编写后台代码,那么 Runnable 的意义何在?
  2. 处理程序如何在线程中使用,为什么我们需要使用它。
  3. Android还有另一个叫做runOnUiThread的东西,我们如何使用它?我知道它用于更新UI。

答案 1

为什么使用 Runnable over Thread?

  • Runnable将需要异步运行的代码与代码的运行方式分开。这使您的代码保持灵活性。例如,可运行实例中的异步代码可以在线程池或专用线程上运行。

    A 已声明您的可运行可能不需要访问。访问超出必要数量的状态是糟糕的设计。Thread

    线程占用大量内存。为每个小操作创建新线程需要处理时间来分配和释放此内存。

runOnUiThread 实际上在做什么?

  • Android 的 runOnUiThread 将 a 排队在 UI 线程上执行。这很重要,因为切勿从多个线程更新 UI。 使用 .RunnablerunOnUiThreadHandler

    请注意,如果 UI 线程的队列已满,或者需要执行的项目很长,则可能需要一段时间才能实际运行排队。Runnable

什么是处理程序?

  • 处理程序允许您发布要在特定线程上执行的可运行项。在幕后,runOnUi Thread将您与Android的Ui Handler排队,以便您的可运行可以在UI线程上安全地执行。Runnable

答案 2

1. 为什么可运行?

Runnable只是一个接口,你需要实例化一个线程来包含它。而线程已经包含生成线程的能力。如果扩展 Thread,则无法扩展其他任何内容(Java 不支持多重继承)。一个类上可以有多个接口,因此可以运行。

此外,在扩展 Thread 类时,每个线程都会创建唯一的对象并与其关联。实现 Runnable 时,它会将同一对象共享给多个线程。

2. 为什么要使用处理程序,它是什么?

处理程序是用Java编写的(内部使用线程),所以你可以用处理程序做的所有事情,你也可以使用线程来实现。

那么为什么要使用Handler呢?原因如下

  • 处理程序允许您发送和处理与线程的 MessageQueue 关联的 Message 和 Runnable 对象。简单来说,处理程序使您的工作变得容易。

  • Android 有两个主要规则来处理线程:

  • 不要阻塞 UI 线程

  • 不要从 UI 线程外部访问 Android UI 工具包

为了按照上述2条规则进行绑定,在android中,我们有3个内置方法,可以处理其中一个活动类在另一个线程上运行或从另一个线程调用的情况。

然后,我们可以使用以下三种方法将 UI 更新安排在 UI 线程上运行。然后,活动或视图充当处理程序(下面将详细介绍处理程序),并将可运行的时间安排到 UI 线程:

  1. Activity.runOnUiThread(Runnable)
    1. View.post(可运行)
    2. View.postDelayed(Runnable, long) //(long = time to schedule)

3. 什么是 UI 线程?

UI 线程是在其中呈现 UI 元素(如视图和活动)的主线程。不应在 UI 线程中发生任何耗时的操作。应用程序默认值在 UI 线程中运行。您无需执行任何特殊操作即可使用 UI 线程。


推荐