@Lixo

RxJava + Retrofit как асинхронно выполнить серию последовательных запросов?

Есть апи сервера что-то типа https://.../api/getData?limit=10&offset=0
Запрашиваем данные "постранично" в резултате получаем JSON
{
    rowTotal: 1000, <--- общее количество данных
    data: [ 
            //массив объектов
           {
                ... //объект
            }
           ...
       ]
}

Как используя RxJava получить все данные, т.е в данном случае, если за один запрос мы получаем 10 объектов ( limit=10 ) а всего их 1000 (rowTotal: 1000), то надо выполнить 100 запросов последовательно, но в фоне.
Сейчас это реализовано внутри AsyncTask и выглядит примерно так:
int page = 0;
int total = 0;
int offset = 0;
do {
	offset = page * PAGE_SIZE;
	TPResponse tpResponse = null;
	try {
		Response response = api.getByRange("api/all-data-by-range", offset, PAGE_SIZE).execute();
		if (response.body() == null) {
			break;
		}

		tpResponse = (TPResponse) response.body();
		total = tpResponse.getTotalRecords();

		if (tpResponse.getData() != null && !tpResponse.getData().isEmpty()) {
			//передаем данные на обработку
			dataArrivedListener.ModelsArrived(tpResponse.getData());
		}

	} catch (IOException e) {
		Log.e("SYNC ERROR", String.valueOf(offset));
		e.printStackTrace();
		return;
	}

	page++;

	//считаем процент загруженных данных
	int totalPages = (int) Math.ceil((float) total / PAGE_SIZE);
	publishProgress((int) ((page / (float) totalPages) * 100));

} while ((offset + PAGE_SIZE) < total);

Хочу переписать использую RxJava. Интересует общая концепция или ссылка на пример.
  • Вопрос задан
  • 850 просмотров
Пригласить эксперта
Ответы на вопрос 3
@z0rgoyok
Observable.fromCallable {
    for (i in 1..10000) {
        load_4to_nado(i) 
    }
}

можно как-то так)
Ответ написан
@aol-nnov
неоптимально грузить все тысячи записей на клиента.

R в аббревиатуре Rx означает reactive.
reactive (англ.) - реагирующий; дающий реакцию;

А теперь подумай, как тебе реагировать. Например, ты грузишь 10, пользователь проскроллил 5, ты грузишь (реагируешь) еще 10, пользователь проскроллил... ну, идея ясна, думаю.

Это несравненно более приятный опыт, чем лицезреть спиннер, пока все тысячи загрузятся или дергающийся список от не по порядку приходящих асинхронных ответов.
Ответ написан
@klim76
android/java/sql
а точно последовательно надо?
так не взлетит?
Observable result
for(page = 0; page < total/lim; page++){
result.concat....(yuoyapi.apicall.(page))
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы