Подтвердить что ты не робот

Android-эквивалент API-интерфейса iOS GCD dispatch_group

Я родом из iOS, и я новичок в Android.

Существует ли эффективный и быстрый способ сделать один и тот же сетевой API-вызов, но с разными параметрами каждый раз, когда параметры хранятся в массиве. Я бы хотел только вернуться, когда все вызовы API сети завершились, но я не хочу, чтобы какие-либо из вызовов api в цикле блокировали другие вызовы api в цикле.

В основном я хочу получить эквивалент этого кода Swift. В принципе, функция ниже не вернется, пока все сетевые вызовы getData не преуспели или не сработали. Как я могу выполнить то же самое в Android?

func getDataForParameters(array: NSArray) {
    let group = dispatch_group_create()
    for (var i = 0; i < array!.count(); i++) {
        let param = array![i]
        dispatch_group_enter(group)

        getData(param, success: {
            () in
            dispatch_group_leave(group)

            }, failure: {
                () in
                dispatch_group_leave(group)
        })
    }
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
}
4b9b3361

Ответ 1

У вас есть много способов добиться этого.

  • Вы можете использовать Thread.join(), если вы используете потоки
  • вы можете использовать сторонние библиотеки, такие как RxJava.
  • вы можете написать свой собственный диспетчер событий, вот уродливый пример
  • Этот ответ также охватывает ваш вопрос Callable и Future

Ответ 2

Если сетевые вызовы в цикле не должны блокировать другой сетевой вызов, вы должны сделать сетевые вызовы асинхронно.

Вы можете использовать сетевую библиотеку goley volley для выполнения сетевых вызовов, и они выполняются асинхронно. Следуйте приведенной ниже ссылке для волейбола

https://developer.android.com/training/volley/index.html.

если вы можете реализовать счетчик, который увеличивается при успешном или неудачном обратном вызове, вы можете использовать эту переменную, чтобы определить, когда вернуться к вашему вызывающему методу.

Поскольку сетевые вызовы выполняются асинхронно, вам необходимо написать интерфейс обратного вызова, который должен запускаться после выполнения условия встречного вызова, чтобы он отправил обратный вызов вызываемому методу. вы можете найти множество примеров того, как использовать механизм обратного вызова в Android. Функции обратного вызова напоминают функции делегата в IOS.

Надеюсь, это поможет.