Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 阻止IntentService创建_Android_Service_Synchronization_Mutex - Fatal编程技术网

Android 阻止IntentService创建

Android 阻止IntentService创建,android,service,synchronization,mutex,Android,Service,Synchronization,Mutex,我的应用程序从IntentService调用其web服务。每个意图实际上都是一个需要进行的web服务调用 如您所知,IntentService将Intent排队;因此,在任何给定的时间只有一个web服务调用发生。这实际上是期望的行为 然而,这确实存在一个问题。假设我的应用程序在此IntentService中排队等待5个意向。假设用户最终出现在一个屏幕上,当从web服务检索某些数据时,该屏幕可能会显示UI。如果将此web服务的意图放在队列的后面,那么在调用web服务之前可能需要很长一段时间,这会让

我的应用程序从IntentService调用其web服务。每个意图实际上都是一个需要进行的web服务调用

如您所知,IntentService将Intent排队;因此,在任何给定的时间只有一个web服务调用发生。这实际上是期望的行为

然而,这确实存在一个问题。假设我的应用程序在此IntentService中排队等待5个意向。假设用户最终出现在一个屏幕上,当从web服务检索某些数据时,该屏幕可能会显示UI。如果将此web服务的意图放在队列的后面,那么在调用web服务之前可能需要很长一段时间,这会让用户耽误不可接受的时间

因为我不能将意图注入到IntentService队列的前端(据我所知),所以我决定为需要立即执行的调用创建第二个IntentService。由于我只希望在任何给定时间有一个调用命中我的服务,所以我在实际的Http代码周围包装了一个互斥体。因此,在本例中,Intent将立即执行(因为它位于不同的IntentService中),但在互斥体上循环,直到另一个IntentService中的任何调用完成

这对我有好处;我对这一切都很满意

我的问题是:

理论上,新的IntentService也可以排队。由于应用程序工作流的原因,这种情况不太可能发生,但在理论上是可能的。如果是这种情况,我希望新的IntentService在原始IntentService再次恢复之前完成。我的想法是在新IntentService的create和destroy方法中锁定/解锁一个新的互斥锁。在旧IntentService的OnHandleContent方法的开始和结束处,同样的互斥锁也将被锁定/解锁。但是,我关心的是,在创建IntentService时锁定互斥锁会产生什么样的后果,从而阻碍其创建(可能会在锁定之前调用super.create)。意向者还能排队吗?这样做还有其他陷阱吗

因为我不能将意图注入到IntentService队列的前端(据我所知)

而不是标准实现。然而,
IntentService
并不是一个大类。您可以克隆它,并将它现在使用的基于
处理程序的系统替换为
优先级阻塞队列

这样做还有其他陷阱吗

除了把我吓得屁滚尿流,就可能的僵局而言

您可以沿着这些线查看或查看其他内容,而不是
Mutex
对。虽然从技术上讲,您的场景不是“读”对“写”的场景,但您可以将“读”和“写”简单地视为两个优先级。有一些方法可以配置这样一个锁来支持“写入”,因此您的第二个
IntentService
将是“写入”,而您的第一个
IntentService
将是“读取”


但是我真的希望用一个具有您所寻求的特征的类似工作来替换
IntentService
,而不是试图让两个
IntentService
一起工作。

我想我会考虑修改IntentService类,允许我将intent注入队列的前端。我很有信心我目前的计划不会出现僵局,但值得调查以避免任何可能性。谢谢你的帮助。