【问题标题】:How to temporarily acquire lock for IntentService from Fragment如何从 Fragment 临时获取 IntentService 的锁
【发布时间】:2016-03-17 13:54:04
【问题描述】:

我有 IntentService 用于将照片文件按顺序上传到服务器。我有画廊片段显示上传队列中的文件和已上传到服务器的文件。我使用对服务器的 api-call 获取已上传文件的列表。将要上传的本地文件仅存储在数据库中。

下一个文件上传后 - IntentService 将事件发送到 Gallery 片段。之后,我可以隐藏上传文件的进度轮并从数据库中删除有关该文件的记录。这部分效果很好。

出于同步原因,我想阻止来自上传服务的所有事件(让它们等待),同时获取远程文件的 api-request 正在进行。

我担心的是 - 一些文件可以在请求远程文件的同时上传,我将失去该事件。如何延迟从 Service 传递事件直到 api-request 完成?

【问题讨论】:

  • 如何将事件从服务获取到片段?通过接口?
  • @penguin,问题是我异步调用 API 请求。我在回调中收到结果,很遗憾您提供的方法不起作用。

标签: android synchronization locking synchronized android-intentservice


【解决方案1】:

在您的片段中,您可以这样做:

boolean isRequestingAPI = false;
.
.
.

//Requesting API on server

isRequestingAPI = true

synchronize(isRequestingAPI){
   // do request API here


   //You get callback from API 
   isRequestingAPI = false;
}

.
.
.

//Getting event from Service

private void onEventFromServceListener(){

   if(isRequestingAPI){
       //Put event/data in a queue and consume it when when you get callback from API
   }
   synchronize(isRequestingAPI){
       //do whatever your want to do with event from service
   }
}

通过使用synchronize(isRequestingAPI),您的 API 调用和来自服务的事件将成为互斥事件。每个事件都将等待其他事件先完成。

【讨论】:

  • 问题是我异步调用API请求。我在回调中收到结果,很遗憾您提供的方法不起作用。
  • 我已经更新了我的答案。使用我的解决方案并创建一个队列。如果服务的任何事件在 API 调用及其回调之间到达,则将其放入队列中,并在 API 的回调到达时使用它。
猜你喜欢
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
相关资源
最近更新 更多