Вызов View не из главного потока

171
15 октября 2017, 21:10

У меня есть 2 класса: MainActivity, ChatsCommunicator и интерфейс IView.

MainActivity реализовывает IView интерфейс. В интерфейсе есть метод onGetChatsMethod(List<ChatsDialogModel> chatsModel), который переопределяет MainActivity:

@Override
public void onGetChatsSuccess(final RealmResults<ChatsModel> chatsList) {
    Log.d(LOG_TAG, "onCreate, getChatsByCount(17) finish ");
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            mChatsRV.setAdapter(new ChatsAdapter(chatsList));
        }
    });
}

ChatsCommunicator в свою очередь отправляет тот RealmResults<ChatsModel> chatsList:

new Thread(new Runnable() {
       @Override
       public void run() {
           ChatsRepository chatsRepository = new ChatsRepository();
           RealmResults<ChatsModel> realmResults = chatsRepository.getAllRecords();
           chatsCallback.onGetChatsSuccess(chatsModel, false);
       }
}).start();

Как видите, действия с RecyclerView делаются в методе runOnUiThread. А чтение и отправка данных из Realm в новом потоке.

До этого не было ни runOnUiThread ни Thread, но главный поток тормозил пока данные брались из базы. А сейчас после нового потока в ChatsCommunicator MainActivity шустро работает. Но у меня есть еще несколько методов которые работают в главном потоке и тоже вызывают chatsCallback.onGetChatsSuccess(RealmResults<ChatsModel> chatsList), а для них runOnUiThread не нужен и вообще метод runOnUiThread мне глаза режет.

Вопрос: как можно в MainActivity обойтись без runOnUiThread или в ChatsCommunicator без new Thread()?

UPD:

Я пробовал считывать данные из Realm с методом findAllAsync() но тогда chatsCallback.onGetChatsSuccess(chatsModel, false); все равно срабатывает не ожидая ответа от базы.

Answer 1

Эта задача легко решается с использованием rxJava так:

Realm.getDefaultInstance().where(ChatsModel.class).findAllAsync().asObservable()
    .filter(RealmResult::isLoaded)
    .filter(RealmResult::isValid)
    .subscribe(results -> chatsCallback.onGetChatsSuccess(chatsModel, false));

Вызовите этот код из основного потока и результат выборки будет передан в колбэк в основном же потоке каждый раз при изменении выборки. При этом вам не надо создавать потоки, вызывать runOnuiThread и выборка из БД будет не в основном потоке сделана.

READ ALSO
Разница между способами клонирования

Разница между способами клонирования

Есть ли принципиальная разница между использованием superclone() и созданием нового объекта с помощью new?

177
Одна сессия, но разные ID. WebSocket Java &amp; JavaScript

Одна сессия, но разные ID. WebSocket Java & JavaScript

Пишу чат элементарныйЗапуская сервер - вижу, что количество сессий всегда равняется "1", сколько бы вкладок или браузеров я бы не открыл

247