使用Android Realm在线程之间编写和读取

时间:2015-01-25 07:10:14

标签: android multithreading realm

我正在对Realm线程进行调查并遇到问题。

在这个简单的例子中,我有2个Thread个对象,一个用于写入,第二个用于阅读。读者Thread将写入的对象的计数始终为0,但在编写器范围内,DB中项目的size()是正确的。当我重新启动应用程序时,读者会在任何插入之前获得第一次计数。

Thread writer = new Thread() {

    @Override
    public void run() {
        while (mRunning) {
            try {
                Realm r = Realm.getInstance(context, "test_db");
                r.beginTransaction();

                TestData data = r.createObject(TestData.class);

                r.commitTransaction();

                Logger.e("WRITER THREAD COUNT: " + 
                    r.where(TestData.class).findAll().size());

                sleep(LATENCY);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
};

writer.setPriority(Thread.MAX_PRIORITY);
writer.start();

Thread reader = new Thread() {

    @Override
    public void run() {
        while (mRunning) {
            try {
                Logger.e("READING THREAD COUNT: " + Realm.getInstance(context,
                        "test_db").where(TestData.class).findAll().size());

                sleep(LATENCY);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
};

reader.setPriority(Thread.MAX_PRIORITY);
reader.start();

是否需要采取措施才能实现这一目标?

感谢。

1 个答案:

答案 0 :(得分:8)

来自Realm的Emanuele。

您所描述的是预期的行为:)由于读者线程没有Looper,因此它无法接收来自读者线程的通知,并且永远不会更新,除非您手动执行{ {1}}。

在out repo中,我们使用带有和不带refresh的线程的几个例子(更不用说单元测试),说明当前的最佳实践。