编程语言
首页 > 编程语言> > java – 一次刷新多个Realm实例?

java – 一次刷新多个Realm实例?

作者:互联网

我正在使用一个设置,其中每个保留片段的Presenter都有自己的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.)使用全局刷新事件在同一线程上更新多个域的资源密集程度如何?

解决方法:

Realm在内部使用ThreadLocal缓存. Realm文件因此几乎可以在您拥有的每个activity / fragment / presenter中调用Realm.getInstance().第一次调用Realm.getInstance()会花费一些资源,因为必须打开数据库并验证模式,但之后只需要进行缓存查找.

缓存是引用计数的,因此只有在关闭所有实例后才会释放本机资源.这意味着尽可能长时间地保持至少一个打开的实例是有益的.

这也意味着当您更新其中一个打开实例时,它们都会自动更新.

标签:event-bus,android,java,multithreading,realm
来源: https://codeday.me/bug/20191002/1844498.html