Я использую настройку, в которой каждый Presenter
, который является сохраненным Fragment
, имеет свой собственный экземпляр Realm
. Однако это по существу означает, что эти Царства находятся в основном потоке.Обновление нескольких экземпляров Realm сразу?
Теперь это также означает, что если я хочу изменить Царство, мне нужно либо сделать это на основном потоке (что хорошо для небольших наборов данных, но я действительно не хочу этого делать с большими наборами данных), или мне нужно сделать это в фоновом потоке и обновить каждые Экземпляр Realm сразу (что возможно с помощью простого события на шину событий).
public enum SingletonBus {
INSTANCE;
private static String TAG = SingletonBus.class.getSimpleName();
private Bus bus;
private boolean paused;
private final Vector<Object> eventQueueBuffer = new Vector<>();
private Handler handler = new Handler(Looper.getMainLooper());
private SingletonBus() {
this.bus = new Bus(ThreadEnforcer.ANY);
}
public <T> void postToSameThread(final T event) {
bus.post(event);
}
public <T> void postToMainThread(final T event) {
try {
if(paused) {
eventQueueBuffer.add(event);
} else {
handler.post(new Runnable() {
@Override
public void run() {
try {
bus.post(event);
} catch(Exception e) {
Log.e(TAG, "POST TO MAIN THREAD: BUS LEVEL");
throw e;
}
}
});
}
} catch(Exception e) {
Log.e(TAG, "POST TO MAIN THREAD: HANDLER LEVEL");
throw e;
}
}
public <T> void register(T subscriber) {
bus.register(subscriber);
}
public <T> void unregister(T subscriber) {
bus.unregister(subscriber);
}
public boolean isPaused() {
return paused;
}
public void setPaused(boolean paused) {
this.paused = paused;
if(!paused) {
Iterator<Object> eventIterator = eventQueueBuffer.iterator();
while(eventIterator.hasNext()) {
Object event = eventIterator.next();
postToMainThread(event);
eventIterator.remove();
}
}
}
}
И
SingletonBus.INSTANCE.postToMainThread(new RealmRefreshEvent());
@Subscribe
public void onRealmRefreshEvent(RealmRefreshEvent e) {
this.realm.refresh();
}
Но если предположить, у меня есть около 5-7 экземпляров области открытого в главном потоке (как каждый ведущие имеют свою собственную открытую область, пока они не уничтожены), я обеспокоен о производительности и/или использовании памяти.
Так что я думаю, у меня есть два вопроса,
1.) Это плохая практика/сильно ресурсоемкий иметь несколько экземпляров Realm открытых на основной нити?
2.) Насколько ресурсоемким является обновление нескольких Realms в одном потоке с помощью глобального события refresh
?
Ах, в этом случае, я должен убедиться, что я обновляю только * один * экземпляр, так что я не называют 'Refresh()' метод N раз. Тем не менее, у меня есть доступ к одному царству за раз, я думаю, что вызов 'refresh()' не должен быть глобальным, просто вызывается одним экземпляром в основном потоке. Ухоженная! Спасибо за ответ :) – EpicPandaForce
Подождите, означает ли это, что я могу просто дать runnable обработчику, который отправляет сообщения основному петлеучеру, который получает экземпляр realm, вызывает обновление, затем закрывает его - и обновляет * каждый * realm on основной поток? – EpicPandaForce
Да, это должно работать, но мы уже делаем это для вас :). Если у вас есть данные, записывающие Realm в фоновый поток, он уже отправляет сообщение основному петлеучеру, запрашивая, чтобы все Realms обновлялись при совершении транзакции. Также здесь вызывается прослушивание onChange. –