让UI线程等到android中的服务完成

时间:2011-06-08 03:26:30

标签: android

嗨,我有一个问题,我想让UI线程等待,直到服务已经完成,任何人都可以告诉我如何实现这个?

3 个答案:

答案 0 :(得分:1)

我可以告诉你,你永远不应该让UI线程等待:

  

总而言之,应用程序UI的响应能力对于保持UI线程畅通无阻至关重要。

那是来自Painless Threading上的Android开发者页面,您应该完整阅读。无论如何你真的想做什么?

答案 1 :(得分:1)

我将假设您已正确设置服务,以便与您的活动进行通信。

您可以使用Semaphore在服务执行时阻止UI线程。有很多方法可以做到这一点,但为了简单起见,这个Semaphore可能是实用程序类中的静态字段。

public class UtilityClass {
   public static final Semaphore LOCK = new Semaphore(0);
}

在您的UI主题中,您可以执行以下操作:UtilityClass.LOCK.acquire()

在您的服务中,完成后您将释放锁定:UtilityClass.LOCK.release()

请记住,可能需要进行一些检查以确保此方法中没有错误。您需要查看Semaphore文档。例如,在发布许可之前,您可能需要检查是否存在零availablePermits()

我认为这回答了你的问题,但请注意,UI线程上的阻止会导致应用无响应。换句话说,这种方法不是最佳实践,应该避免使用。

答案 2 :(得分:1)

其中一个解决方案:

  • 在您的UI活动中创建一个处理程序,以便读取和写入变量(例如在onCreate函数中创建它)
  • 将BroadCast Receiver放入UI活动
  • 当您的服务终止时,发送广播消息
  • 您的UI活动将收到广播接收器的消息
  • 将您的指示发布到处理程序

教程的关键词:

  • BroadCast Receiver
  • sendBroadcast(意图)
  • Handler post runnable

希望有所帮助