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

问题描述 投票:4回答:4

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

编辑:

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

    }
  }
}

SomeRunnable runnable = new SomeRunnable();
(new Handler()).postDelayed(runnable, 1000);
android runnable
4个回答
11
投票

文档:

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

不同的线程:

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

UI /服务线程:

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

2
投票

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

无论你在Threadservice中开始新的activity,它都不会成为UI线程的一部分(除非你打电话给像join()这样的东西)

编辑

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

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


0
投票

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


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中并检查它的执行位置?

© www.soinside.com 2019 - 2024. All rights reserved.