Retrofit + RxAndroid: медленный запрос блокирует другие запросы

Я столкнулся с проблемой, которая иногда связана с медленными ответами от моего бэкэнда. Фактически, я использую Retrofit + RxAndroid для связи со своим сервером, и когда я делаю несколько запросов, кажется, что за раз выполняется только один запрос. Есть ли способ увеличить этот лимит, чтобы избежать блокировки ожидающих запросов?

Спасибо.

редактировать:

Представьте, что я делаю один запрос к длинному фоновому процессу.

retrofitService.getLongBackgroundProcess(url)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> { //doing something with the result });

И в то же время я делаю еще один запрос к службе, которая может ответить немедленно.

retrofitService.getVeryVeryFastResponse(url)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> { //doing something with the result });

Первый запрос в моем случае блокирует выполнение второго запроса. Это моя проблема. Знаете ли вы, почему и что я могу сделать, чтобы оба запроса выполнялись одновременно?

Спасибо.


person eVoxmusic    schedule 10.06.2015    source источник
comment
Пожалуйста, добавьте код   -  person Smashing    schedule 10.06.2015
comment
Привет, Smashing, вы можете взглянуть на базовый код из примеров модернизации. square.github.io/retrofit   -  person eVoxmusic    schedule 10.06.2015
comment
Да, но я использую модификацию, и моя работает быстро, так что это что-то в вашем коде. Может быть, запускать все из основного потока и не использовать асинхронность или обратные вызовы?   -  person Smashing    schedule 10.06.2015
comment
На самом деле проблем с общением с бэкендом нет. Но если бэкенду требуется 5 секунд, чтобы ответить, модификация не выполняет другие ожидающие запросы.   -  person eVoxmusic    schedule 10.06.2015
comment
Вы указали параллельный планировщик? reactivex.io/documentation/scheduler.html   -  person Sergii Pechenizkyi    schedule 10.06.2015
comment
Нет, не @SergiiPechenizkyi. Это связано?   -  person eVoxmusic    schedule 10.06.2015
comment
Для каждого запроса к бэкенду я использую Schedulers.newThread()   -  person eVoxmusic    schedule 10.06.2015


Ответы (2)


Вы можете самостоятельно контролировать, где выполняются запросы, например:

retrofitService.getImage(url)
.subscribeOn(Schedulers.io()) // or .subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(bitmap -> myImageView.setImageBitmap(bitmap));

Доступно несколько планировщиков. Ознакомьтесь с документацией здесь: http://reactivex.io/documentation/scheduler.html.

Полезно прочитать по теме: http://blog.danlew.net/2014/10/08/grokking-rxjava-part-4/

person Sergii Pechenizkyi    schedule 10.06.2015
comment
Это уже то, что я сделал. Чтобы быть более точным, в моем случае я использую Schedulers.newThread(). - person eVoxmusic; 10.06.2015
comment
вы должны поделиться некоторым кодом, чтобы указать, что не работает и что вы ожидаете - person Sergii Pechenizkyi; 10.06.2015
comment
Сергей, поделюсь примером :) - person eVoxmusic; 10.06.2015

Похоже, что проблема была ни от ретрофита, ни от rxandroid. Мой бэкэнд кажется проблемой.

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

Спасибо за помощь.

person eVoxmusic    schedule 12.06.2015