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