在Android中,当我在服务中创建runnable并运行它时,当我意识到它在自己的线程中运行时,这个线程是否是UI线程的一部分?换句话说,如果runnable执行了一个很长的过程,它会影响UI吗?
修改
private class SomeRunnable implements Runnable
{
@Override
public void run()
{
try
{
}
}
}
SomeRunnable runnable = new SomeRunnable();
(new Handler()).postDelayed(runnable, 1000);
答案 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线程的一部分