4

在 Android 中,当我在服务中创建一个可运行对象并运行它时,虽然我意识到它在自己的线程中运行,但这个线程是否是 UI 线程的一部分?换句话说,如果runnable执行了很长的过程,会不会影响UI?

编辑:

private class SomeRunnable implements Runnable
{
  @Override
  public void run()
  {
    try
    {

    }
  }
}

SomeRunnable runnable = new SomeRunnable();
(new Handler()).postDelayed(runnable, 1000);
4

4 回答 4

11

文件:

服务在与声明它的应用程序相同的进程中运行,并且在该应用程序的主线程中运行,

不同的线程:

Thread t = new Thread(new MyRunnable());
t.start();

UI/服务线程:

Handler h = new Handler();
h.post(new MyRunnable());
于 2013-02-11T08:54:29.370 回答
2

不,它不是 的一部分UI thread,我假设Runnable您的意思是您通过调用执行的新线程start()

无论你是在 a 中开始一个新Thread的,service还是activity不会成为 UI 线程的一部分(除非你调用类似的东西join()

编辑

由于您正在使用 运行Runnable对象,因此这取决于您Handler在哪里初始化handler. 服务在 中运行main thread,因此在服务或活动中初始化处理程序将使代码发布到UI thread

Handler请注意,每个线程都需要一个对象;所以避免每次都创建一个新的,例如(new Handler()).postDelayed(runnable, 1000);应该避免,而是handler.postDelayed(runnable, 1000);handler你的服务/活动类中初始化一个实例变量

于 2013-02-11T08:51:21.573 回答
0

默认情况下,服务在 UI 线程中运行。但这取决于服务类型和服务属性以及您发布可运行文件的方式。我认为您使用默认方案,您的可运行文件将在 UI 线程上执行并阻止它。

如果您显示代码如何发布可运行并创建服务,我可以给您确切的答案。

您可以使用以下代码从可运行文件中检查线程类型:

if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
    // On UI thread.
} else {
    // Not on UI thread.
}

目前还不清楚。如果你在 UI 线程上执行“new Handler()”,那么 runnable 将在 UI 线程上执行。如果您在另一个带有 looper 的线程上执行“new Handler()”,那么 runnable 将在该线程上执行。我认为您的可运行文件有 99% 的可能性将在 UI 线程上执行。为什么不将我的代码放在可运行状态并检查它的执行位置?

于 2013-02-11T08:53:45.800 回答
0

您提交给处理程序的可运行文件将始终在 UI 线程上执行,因为服务不会在不同的进程或线程上产生,但您是 hte UI 线程的一部分

于 2013-02-11T09:00:21.257 回答