当前位置: 首页 > 面试题库 >

一次刷新多个Realm实例?

郜联
2023-03-14
问题内容

我正在使用一个设置,其中每个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.)使用全局refresh事件在同一线程上更新多个领域会占用大量资源吗?


问题答案:

Realm内部使用ThreadLocal缓存。领域文件,因此实际上可以自由调用Realm.getInstance()您拥有的每个活动/片段/演示者。第一次调用需要Realm.getInstance()花费一些时间,因为必须打开数据库并验证架构,但是之后只需要进行缓存查找。

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

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



 类似资料:
  • 问题内容: Python多久刷新一次文件? Python多久刷新一次到stdout? 我不确定(1)。 至于(2),我相信Python会在每一行后刷新到stdout。但是,如果将stdout重载为文件,它是否会经常刷新? 问题答案: 对于文件操作,除非你另行配置,否则Python使用操作系统的默认缓冲。你可以指定缓冲区大小,未缓冲或行缓冲。 例如,open函数采用缓冲区大小参数。 http://d

  • 我想在3个表中插入记录。代码如下。 地址的密钥是aID,客户的密钥是cID。它们是自动增量。在顾客中,有一个外键受地址的aID约束。HomeCu的外键cID受客户的cID约束。所以我想插入地址,客户,HomeCu顺序,在此期间,我必须得到密钥而不做提交。我使用flush()来获取密钥,但在提交操作中失败。为什么在提交操作中,像电子邮件、密码这样的值变成无,但打印语句做得很好?我已经为此挣扎了几个小

  • 问题内容: 我有一个C#Windows窗体,其中包含几个文本框和按钮。它还具有显示sql表的datagrid视图。我创建了一个刷新按钮,使我可以刷新表,以便可以看到表中的更新项。我想知道有没有办法自行刷新表。就像每10秒一次,或者代替表格,也许每10秒就会自动加载或刷新整个表格吗? 问题答案: 使用Timer控件,它调用了UI线程,并且可以通过表单设计器使用该控件。

  • 本文向大家介绍vue props 一次传多个值实例,包括了vue props 一次传多个值实例的使用技巧和注意事项,需要的朋友参考一下 数组: <custom-element :whatever="[...array]"></custom-element> 对象: <custom-element :whatever="{...obj}"></custom-element> 或者: <custom-

  • 问题内容: 我的代码中需要一个单例。我用Java实现了它,并且效果很好。我这样做的原因是为了确保在多种环境中只有一个此类的实例。 但是现在我想用单元测试在本地测试我的Singleton对象。因此,我需要模拟此Singleton的另一个实例(该对象可能来自另一个设备)。那么是否有可能第二次实例化Singleton以进行测试,还是我必须对其进行模拟? 我不确定,但是我认为可以通过使用其他类加载器来实现

  • 是否有一种方法可以在一次刷卡中实现一次只刷一张卡来解除颤振动作?