我已经阅读了很多关于如何使用锁的不同建议 - 但我在IOS和Android中的当前代码的行为表现不正确。
我要做的是使用HTTP请求构建队列系统。如果请求失败,则应该是第一个要重试的请求。发送和添加到队列都采用相同的方法,因此在前一个请求完成之前,它不会将新对象添加到队列中。如果一个失败并且添加了下一个请求,它将发送两个请求(在同一个包中并清除队列)。
机器人:
// Java
synchronized(locker)
{
Add object to a queue if there is a new object to be added
If any objects in queue - send request with AsyncTask
}
IOS:
// Objective-C
@synchronized(locker)
{
Add object to a queue if there is a new object to be added
If any objects in queue - send request with NSURLSessionDataTask
}
...如果失败,请不要从队列中删除该对象。
在这种情况下 - 我猜测锁是否会被释放,而另一个线程可能会立即发送下一个请求并首先出现,因为任务是在另一个线程中调度的?
我已尝试使用普通锁定在Android上取得一些成功,并在整个系统冻结的iOS上完全失败。从那以后我读到关于在IOS上锁定它必须由同一个线程解锁的锁定 - 整个方法上的dispatch_async(dispatch_get_main_queue()...是否工作,或者当completitionHandler完成时我将不得不再次调度它?我可以确定completitionHandler是在与创建它的方法相同的线程上调用的吗?
以正确的顺序发送每个包非常重要。对于像这样的多线程HTTP请求系统,最好的方法是什么?
答案 0 :(得分:0)
不要AsyncTask
或NSURLSessionDataTask
生成新主题。如果您需要线程进行序列化,即最多其中一个可能同时运行,而下一个必须等待第一个完全完成,那么绝对没有理由运行多个线程。
您将需要一(1)个线程用于所有请求,并可能使用队列向其发送数据。否则,UI可能会在发送http请求时冻结。