我正在使用一个设置,其中每个Presenter
保留的Fragment
都有自己的Realm
实例。但是,这实质上意味着这些 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 实例是不好的做法/资源密集型吗?
refresh
2.) 使用全局事件在同一个线程上更新多个 Realm 的资源密集程度如何?