在Android中,当我创建一个可运行的服务中,并运行它,当我意识到这一点在自己的线程中运行,这是线程UI线程的莫名其妙的一部分? 换句话说,如果可运行进行了一个漫长的过程,它会影响到用户界面?
编辑:
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
是一个实例变量在您的服务/活动类初始化
您提交到处理程序将可运行在UI线程上总是执行,因为服务没有在不同的进程或threda产卵,但你是兴田UI线程的一部分
默认情况下,服务运行在UI线程。 但是,这取决于服务类型和服务性能和您发布可运行的方式。 我认为你使用默认方案,你的可运行将在UI线程上执行,并阻止它。
如果你告诉你的代码后如何运行的,创造的服务,我可以给你确切的答案。
您可以从您使用下面的代码运行的线程检查类型:
if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
// On UI thread.
} else {
// Not on UI thread.
}
它仍然是不明确的。 如果执行比上运行的UI线程“新的处理程序()”将在UI线程上执行。 如果执行上弯针比可运行的另一个线程“新的处理程序()”将在该线程执行。 我认为,概率99%,您可运行将在UI线程上执行。 你为什么不把我的代码可以运行,并检查它执行?