在Android中,当我在服务中创建runnable并运行它时,虽然我意识到它在自己的线程中运行,但这个线程是否是UI线程的一部分?换句话说,如果runnable执行了一个很长的过程,它会影响用户界面吗?
编辑:
private class SomeRunnable implements Runnable
{
@Override
public void run()
{
try
{
}
}
}
SomeRunnable runnable = new SomeRunnable();
(new Handler()).postDelayed(runnable, 1000);
文档:
服务在与声明它的应用程序相同的进程中运行,并在该应用程序的主线程中运行,
不同的线程:
Thread t = new Thread(new MyRunnable());
t.start();
UI /服务线程:
Handler h = new Handler();
h.post(new MyRunnable());
不,它不是UI thread
的一部分,我假设Runnable
你的意思是你通过调用start()
执行的新线程。
无论你在Thread
或service
中开始新的activity
,它都不会成为UI线程的一部分(除非你打电话给像join()
这样的东西)
编辑
由于您使用Runnable
运行Handler
对象,因此它取决于您初始化handler
的位置。服务在main thread
中运行,因此初始化服务或活动中的处理程序将使代码发布到UI thread
注意,你的线程需要一个Handler
对象;因此,请避免每次都创建一个新的,例如应避免使用(new Handler()).postDelayed(runnable, 1000);
,而不是handler.postDelayed(runnable, 1000);
,其中handler
是在您的服务/活动类中初始化的实例变量
您提交给处理程序的runnable将始终在UI线程上执行,因为服务不是在不同的进程或threda上生成的,但是您是hte UI线程的一部分
默认情况下,服务在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中并检查它的执行位置?