Android 在安卓系统中,消息会被屏蔽吗

Android 在安卓系统中,消息会被屏蔽吗,android,Android,我正在写一个从rest接口加载数据的应用程序。 对于这个任务,我使用一个由activitys调用的服务。这些电话是基于“信息”的。我这样做是因为我认为仅仅发送消息不会导致UI线程阻塞(我使用了android文档中的大部分RemoteService示例代码)。但感觉上,如果发送消息的UI线程仍然被阻止(由于消息停止,直到程序流停止,UI才会更新) 我对信息系统的整个想法有什么误解吗?我需要在单独的线程中启动服务才能绕过此问题吗 消息由绑定到用于发送消息的处理程序的线程处理。如果您从UI线程创建了处

我正在写一个从rest接口加载数据的应用程序。 对于这个任务,我使用一个由activitys调用的服务。这些电话是基于“信息”的。我这样做是因为我认为仅仅发送消息不会导致UI线程阻塞(我使用了android文档中的大部分RemoteService示例代码)。但感觉上,如果发送消息的UI线程仍然被阻止(由于消息停止,直到程序流停止,UI才会更新)


我对信息系统的整个想法有什么误解吗?我需要在单独的线程中启动服务才能绕过此问题吗

消息
由绑定到用于发送消息的
处理程序
的线程处理。如果您从UI线程创建了
处理程序
,则消息将在UI线程中处理。您可以使用
HandlerThread
,也可以使用
IntentService

HandlerThread
是具有自己的循环器的线程,您可以从中创建新的处理程序:

thread = new HandlerThread("worker");
thread.start();
handler = new Handler(thread.getLooper());

IntentService
具有工作线程,并且每个启动命令都是从
onHandleIntent(Intent)

中的工作线程处理的,使用处理程序发送消息不会阻塞,这取决于您对它所做的操作。如果您正在向服务发送消息,然后立即在服务器中发送http请求,那么它将被阻止。如果您发送一条消息,然后让服务在操作栏中简单地发布一个通知,那么它就不会阻塞


服务在主UI线程上运行。它们不会在后台运行,因此您在服务中执行的任何操作都将在UI线程上运行,如果服务执行大量工作,则可能会阻止它。

由于我正在处理消息,因此这并不依赖于解决问题。如果我不想从消息切换到意图,你会建议我怎么做?当前im使用服务连接发送消息。我完全按照迪夫说的去做。发送消息并执行http请求,然后阻止UI线程。
message
通过
Handler
发送,而
Handler
使用某个线程的
Looper
。默认情况下,
处理程序
是使用当前线程的
活套
创建的。您可以使用不同的
活套
创建处理程序。Android有
HandlerThread
类,使这更容易
HandlerThread
有自己的
活套
,您可以从此
活套
创建
处理程序
。然后,通过
处理程序发送的每个
消息将由
HandlerThread
处理。DeeV是对的,您应该使用新的工作线程,为其创建
活套
,并从此
活套
创建
处理程序
HandlerThread
只是简化了这一点,它已经包含了
Looper
。您的场景正是我正在做的。如果我正确地理解了Salw,那么服务并不是在所有情况下都在主UI线程上运行。他们总是这样。有一些自定义类包装服务类,服务类几乎立即启动线程,因此它实际上在后台运行。实际上,这就像服务没有在UI线程中运行一样,但它的主要组件仍然在运行。在您的情况下,您可以简单地启动一个线程,在处理消息时处理http请求。这可以通过通用Java线程或AsyncTask完成。AsyncTask可能是最简单的。这是我不想做的事情:为exvery服务器调用打开一个新线程。IntentService SPWAN的新工作线程(如您所说),似乎没有类似的消息类。这有点奇怪<代码>活套
可以在新线程中用于处理消息。如果在
run()
方法中创建消息处理程序,则处理程序将位于线程而不是UI中。运行
Looper
,线程将阻塞,直到您对其调用
Looper.quit()
。这样做意味着你只需要创建一个线程,在每次发送邮件时处理邮件。谢谢大家,这对我帮助很大。在阅读文档时,还学习了很多关于android中多线程的知识。