Как запросить Realm в фоновом потоке с помощью RxJava2

Я хочу читать / запрашивать и преобразовывать данные Realm в фоновый поток, используя RxJava2. Вот Наблюдение:

fun getAllPlayers(): Observable<List<Player>> { return Observable.create { emitter -> val realm = Realm.getDefaultInstance() val players = realm.where(Player::class.java).findAll() val listener = RealmChangeListener<RealmResults<Player>> { players -> if (!emitter.isDisposed) { emitter.onNext(realm.copyFromRealm(players)) } } emitter.setDisposable(Disposables.fromRunnable(Runnable { players.removeChangeListener(listener) realm.close() })) players.addChangeListener(listener) emitter.onNext(realm.copyFromRealm(players)) } } 

Если я попытаюсь применить следующее к наблюдаемому:

 getAllPlayers() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) 

Я получаю эту ужасную ошибку:

java.lang.IllegalStateException: Слушатели не могут использоваться в текущем потоке. Realm не может автоматически обновляться нитью без петлителя.

Итак, давайте создадим Планировщик с Looper:

 fun createSubscribeOnScheduler(): Scheduler { val t = HandlerThread("worker") if (!t.isAlive()) t.start() return AndroidSchedulers.from(t.looper) } 

Мы можем использовать его как таковое:

 val subscribeOnScheduler = createSubscribeOnScheduler() getAllPlayers() .subscribeOn(subscribeOnScheduler) .unsubscribeOn(subscribeOnScheduler) .observeOn(AndroidSchedulers.mainThread()) 

Теперь все работает отлично. Однако кто собирается убить этого HandlerThread? Что делать, если getAllPlayer() вызывается одновременно из нескольких мест? Существуют ли другие (и лучшие) решения для запроса Realm в фоновом потоке с использованием RxJava2?