У меня есть 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); все равно срабатывает не ожидая ответа от базы.
Эта задача легко решается с использованием rxJava так:
Realm.getDefaultInstance().where(ChatsModel.class).findAllAsync().asObservable()
.filter(RealmResult::isLoaded)
.filter(RealmResult::isValid)
.subscribe(results -> chatsCallback.onGetChatsSuccess(chatsModel, false));
Вызовите этот код из основного потока и результат выборки будет передан в колбэк в основном же потоке каждый раз при изменении выборки. При этом вам не надо создавать потоки, вызывать runOnuiThread и выборка из БД будет не в основном потоке сделана.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники