I use a setup in which each Presenter , which is a saved Fragment , has its own instance of Realm . However, this essentially means that these Realms are in the main thread.
Now it also means that if I want to change Realm, I either have to do this in the main thread (which is good for small datasets, but I really don't want to do this with large datasets), or I need to do this in the background thread and update each Realm instance immediately (which is possible using a simple event for the event bus).
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(); } } } }
and
SingletonBus.INSTANCE.postToMainThread(new RealmRefreshEvent()); @Subscribe public void onRealmRefreshEvent(RealmRefreshEvent e) { this.realm.refresh(); }
But assuming that about 5-7 real-world instances are open in the main stream (since each presenter has his own area until they are destroyed), I am concerned about the performance and / or use of memory.
So, I have two questions:
1.) Is it bad practice / resource intensive to have multiple instances of Realm open in the main thread?
2.) How resource-intensive is updating multiple Realms in the same thread with the global refresh event?
source share