У меня есть 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
и выборка из БД будет не в основном потоке сделана.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть ли принципиальная разница между использованием superclone() и созданием нового объекта с помощью new?
Пишу чат элементарныйЗапуская сервер - вижу, что количество сессий всегда равняется "1", сколько бы вкладок или браузеров я бы не открыл