Вы можете это сделать, но управление потоками для этих задач может оказаться сложным. Я бы рекомендовал использовать Rxava , чтобы подготовить отдельную наблюдаемую информацию для каждого сайта, с которого вы хотите получать данные. Затем используйте merge или mergeDelayError , чтобы объединить результаты в один Observable, на который вы можете подписаться в главном потоке для обновления вашего пользовательского интерфейса.
Проверьте RxJavaAndroid для получения помощи в подписке на эти обновления в главном потоке Android.
Вам захочется ознакомиться с 4 основными частями RxJava:
- Что вы делаете - в вашем случае это выборка данных с сервера
- Какой пул потоков выполняет эту задачу - я бы порекомендовал Schedulers.io (), который является пулом, выделенным специально для задач ввода-вывода, таких как выборка данных.
- В каком пуле потоков вы будете наблюдать результаты - AndroidSchedulers.mainThread () - то, что вам нужно здесь
- Что делать с результатами - обновить какой-либо пользовательский интерфейс и т. Д.
Это выглядело бы примерно следующим образом при использовании RxJava (в Kotlin)
// What you're doing
Observable.fromCallable {
listOfApps = parseAppsList(Jsoup.connect("server1.host.com"))
return@fromCallable listOfApps
}
// Where you're doing it
.subscribeOn(Schedulers.io())
// Where you're observing results
.observeOn(AndroidSchedulers.mainThread())
// What you're doing with those results
.subscribe({ apps ->
appsList.addAll(apps)
}, { exception ->
// Show an error message
})
Чтобы получить несколько результатов одновременно и добавить их по завершении, ваш код будет выглядеть примерно так:
val fromServer1 = Observable.fromCallable {
listOfApps = parseAppsList(Jsoup.connect("server1.host.com"))
return@fromCallable listOfApps
}
.subscribeOn(Schedulers.io())
val fromServer2 = Observable.fromCallable {
listOfApps = parseAppsList(Jsoup.connect("server2.host.com"))
return@fromCallable listOfApps
}
.subscribeOn(Schedulers.io())
Observable.merge(fromServer1, fromServer2)
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ apps ->
// Note that this callback will be called once per server
appsList.addAll(apps)
}, { exception ->
// Show an error message
})