【问题标题】:Multithreaded HTTP Request Queue System Approach多线程 HTTP 请求队列系统方法
【发布时间】:2016-04-27 17:51:59
【问题描述】:

我已经阅读了很多关于如何使用锁的不同建议 - 但我当前的代码在 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()... 是否可以工作,或者我是否必须在 CompletionHandler 完成时再次分派它? 我可以确定completionHandler 是在与创建它的方法相同的线程上调用的吗?

以正确的顺序发送每个包裹非常重要。像这样的多线程 HTTP 请求系统的最佳方法是什么?

【问题讨论】:

  • 你的问题对我来说没有多大意义。 “发送和添加到队列都是使用相同的方法,因此在前一个请求完成之前,它不应将新对象添加到队列中”。这不会让它不是一个队列吗?如果在发送最后一个请求之前无法添加新请求?另外,为什么要实现自己的锁定而不是使用 ConcurrentLinkedQueue 等?我也不明白你遇到了什么问题,你解释得不好。

标签: android ios multithreading locking httprequest


【解决方案1】:

不要通过AsyncTaskNSURLSessionDataTask 生成新线程。如果您需要线程序列化,即最多其中一个可以同时运行,而下一个必须等​​待第一个完全完成,那么绝对没有理由运行多个线程。

您将需要一 (1) 个线程来处理所有请求,并且可能使用队列向其发送数据。否则,发送 http 请求时 UI 可能会冻结。

【讨论】:

    猜你喜欢
    • 2010-10-17
    • 2017-09-28
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2018-08-17
    • 2014-06-12
    相关资源
    最近更新 更多