Intereting Posts
Как установить цвет сообщения TextInputLayout? Активность Android по блокировке блокировки по умолчанию C # Web – localhost: порт работает, 127.0.0.1:port не работает Android: Создайте Mock Intent и верните некоторые данные намерения из него. В Android я могу программно определить, что компас еще не откалиброван? Проверка на стороне сервера биллинга версии 3 для покупок в приложении Google Должен ли я комментировать мои запросы на журнал при создании моего последнего пакета? Программная клавиатура Android скрывает поля ввода в мобильном веб-приложении HTML5. OnSharedPreferenceChanged не активируется, если изменения происходят в отдельной активности? Повторное использование кода при использовании экранов в Libgdx Как существующие приложения VPN создают новые профили в Android 2.0 – 2.3? Авария Firebase: как программно загружать файл сопоставления? Ошибка: типы строк не разрешены (в 'screenOrientation' со значением 'sensorPortait') Доступ к attrs в AttributeSet для пользовательских компонентов Android: укажите два разных изображения для переключателя с помощью XML

Планировщик одиночных потоков RxJava

Я довольно новичок в RxJava, так что это, наверное, немой вопрос. Я расскажу о своем сценарии.

У меня есть некоторый код, запущенный в потоке пользовательского интерфейса, который будет обновлять некоторые изображения, но эти изображения не очень важны, и они потребляют немного ресурсов при их создании, поэтому я хочу сгенерировать их в одном потоке (а не в потоке пользовательского интерфейса, конечно) и Генерировать их один за другим. Я предполагаю, что планировщик трамплинов – это то, что я хочу, но моя проблема в том, что если я его использую, то он работает над потоком пользовательского интерфейса, и я хочу, чтобы он делал это в другом потоке.

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

Мой текущий код выглядит следующим образом:

Observable<Bitmap> getImage = Observable.create(new Observable.OnSubscribe<Bitmap>() { @Override public void call(Subscriber<? super Bitmap> subscriber) { Log.w(TAG,"On ui thread? "+ UIUtils.isRunningOnUIThread()); subscriber.onNext(doComplexTaskToGetImage()); subscriber.onCompleted(); } }); getImage.subscribeOn(Schedulers.trampoline()).subscribe(new Action1<Bitmap>() { @Override public void call(Bitmap bitmap) { codeToSetTheBitmap(bitmap); } }); 

Мой журнал, в котором говорится: «На ui thread?» Всегда имеет значение true. Итак, как мне сделать этот код и все последующие попытки сделать то же самое, что и в одном потоке (а не в потоке ui), чтобы не писать кучу кода для работы в очереди?

Solutions Collecting From Web of "Планировщик одиночных потоков RxJava"

Вы можете создать один многоразовый поток для создания Scheduler для Observable одним из следующих способов:

  • Создайте ThreadPoolExecuter с размером пула 1 ( Executors.newSingleThreadExecutor() является удобным статическим заводским методом для этого), а затем используйте его для создания планировщиков с помощью метода Schedulers.from() .
  • RxAndroid предоставляет настраиваемую реализацию Scheduler которая использует Handler для планирования действий и, следовательно, может использоваться с любым Thread который работает Looper , передавая его Handler AndroidSchedulers.handlerThread() фабрики AndroidSchedulers.handlerThread() .

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

В RxJava 2 вы можете использовать Schedulers.single() который:

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

Дополнительную информацию см. В документации .

Я не вижу его в документации RjJava 1 Schedulers .