是否在服务运行可运行在UI线程(Does a runnable in a service run o

2019-07-19 17:13发布

在Android中,当我创建一个可运行的服务中,并运行它,当我意识到这一点在自己的线程中运行,这是线程UI线程的莫名其妙的一部分? 换句话说,如果可运行进行了一个漫长的过程,它会影响到用户界面?

编辑:

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

    }
  }
}

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

Answer 1:

文档:

一个服务运行在相同的工艺,声明它的应用程序,并在该应用程序的主线程,

不同的线程:

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

UI /服务主题:

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


Answer 2:

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

不论您是否启动一个新的Threadserviceactivity不会 UI线程的一部分(除非你调用像join()

编辑

既然你正在运行一个Runnable与对象Handler ,因此它取决于你在哪里初始化 handler 。 服务在运行main thread ,所以初始化的服务或活动的处理程序将使代码发布到UI thread

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



Answer 3:

您提交到处理程序将可运行在UI线程上总是执行,因为服务没有在不同的进程或threda产卵,但你是兴田UI线程的一部分



Answer 4:

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

如果你告诉你的代码后如何运行的,创造的服务,我可以给你确切的答案。

您可以从您使用下面的代码运行的线程检查类型:

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

它仍然是不明确的。 如果执行比上运行的UI线程“新的处理程序()”将在UI线程上执行。 如果执行上弯针比可运行的另一个线程“新的处理程序()”将在该线程执行。 我认为,概率99%,您可运行将在UI线程上执行。 你为什么不把我的代码可以运行,并检查它执行?



文章来源: Does a runnable in a service run on the UI thread