Как вызвать вложенный API на Android асинхронно? - PullRequest
0 голосов
/ 21 февраля 2020

Допустим, я хочу получить список новостей через мое приложение Android, например:

[{"title": "Hello world", "date": "0102020" , "readCount:" 44 "}, {" title ":" foo bar "," date ":" 03022020 "," readCount: "200"}, {"title": "Это круто", "readCount": "315"}]

и отображать их с помощью RecyclerView.

По неизвестным причинам дизайнер API сделал процесс менее простым. Сначала вы должны позвонить / get-news-list , который возвращает список идентификаторов новостей, например:

[312, 449, 518, 611, 623, 734 , 755, 812]

Затем с каждым идентификатором в качестве параметра вы вызываете / get-new-detail . Например, / get-news-detail / 312 возвращает:

{"title": "Hello world", "date": "04020202", "readCount": " 132 "," shareCount ":" 150 "}

Я думаю что-то вроде этого:

class FetchNewsDetails extends AsyncTask<String, Void, String>{
// process /get-news-list first
..
..

onPostExecute(){
 // now that we have the list of new IDs, call AsyncTask on each of them to retrieve the details
for (int x = 0; x < newsIDcount; x++){

}
}

Я думаю, что моя идея громоздка. Есть ли способ упростить это?

1 Ответ

2 голосов
/ 21 февраля 2020

Я думаю, что вы должны попробовать Rx Java:

io.reactivex.rxjava2:rxjava:2.2.10
io.reactivex.rxjava2:rxandroid:2.1.0

Тогда вы можете выполнить чтение следующим образом:

    fun getList(): Single<List<Long>> {
        TODO() //reading list of item keys
    }

    fun getItem(itemKey: Long): Single<String> {
        TODO() //reading item
    }

    fun doTheReading(compositeDisposable: CompositeDisposable) {
        compositeDisposable.add(
            getList()
                .flattenAsObservable { it }
                .flatMapSingle { getItem(it) }
                .toList()
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe { t1, t2 -> }
        )
    }

Вам также необходимо очистить В какой-то момент составной объект может быть удаленным, чтобы длительная работа не переживала вашего потребителя.

...