服务中的runnable是否在UI线程上运行

时间:2013-02-11 08:50:06

标签: android runnable

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

修改

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

    }
  }
}

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

4 个答案:

答案 0 :(得分:11)

文档:

  

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

不同的主题:

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

UI /服务主题:

Handler h = new Handler();
h.post(new MyRunnable());

答案 1 :(得分:2)

不,它不属于UI thread,我假设Runnable你的意思是通过调用start()执行的新线程。

无论您是在Thread还是service开始新的activity 都不会成为UI线程的一部分(除非您调用{{}} {1}})

修改

由于您使用join()运行Runnable对象,因此它取决于您初始化 Handler的位置。服务在handler中运行,因此初始化服务或活动中的处理程序将使代码过帐到main thread

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

答案 2 :(得分:0)

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

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

您可以使用以下代码检查runnable中的线程类型:

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

目前尚不清楚。如果在UI线程上执行“new Handler()”,则将在UI线程上执行runnable。如果在另一个具有looper而不是runnable的线程上执行“new Handler()”将在该线程上执行。我认为概率为99%,你的runnable将在UI线程上执行。为什么不将我的代码放在runnable中并检查它的执行位置?

答案 3 :(得分:0)

您提交给处理程序的runnable将始终在UI线程上执行,因为服务不是在不同的进程或threda上生成的,但是您是hte UI线程的一部分