在具有 Android 领域的线程之间写入和读取
Writing and reading between threads with Android Realm
我正在对 Realm
线程和遇到的问题进行一些调查。
在这个简单的示例中,我有 2 个 Thread
对象,一个用于写入,第二个用于读取。 reader Thread
获取写入对象的计数始终为 0,但在编写器范围内,数据库中项目的 size()
是正确的。当我重新启动应用程序时,reader 在任何插入之前获得第一个计数。
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();
是否需要做些什么才能让它起作用?
谢谢。
来自 Realm 的 Emanuele。
您所描述的是预期的行为:) 由于 reader 线程没有 Looper
,它无法从 reader 线程接收通知并将除非您手动执行 refresh
.
,否则永远不会更新
在 out repo 中,我们有几个使用线程和不使用 Looper
的示例(更不用说单元测试了),说明了当前的最佳实践。
我正在对 Realm
线程和遇到的问题进行一些调查。
在这个简单的示例中,我有 2 个 Thread
对象,一个用于写入,第二个用于读取。 reader Thread
获取写入对象的计数始终为 0,但在编写器范围内,数据库中项目的 size()
是正确的。当我重新启动应用程序时,reader 在任何插入之前获得第一个计数。
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();
是否需要做些什么才能让它起作用?
谢谢。
来自 Realm 的 Emanuele。
您所描述的是预期的行为:) 由于 reader 线程没有 Looper
,它无法从 reader 线程接收通知并将除非您手动执行 refresh
.
在 out repo 中,我们有几个使用线程和不使用 Looper
的示例(更不用说单元测试了),说明了当前的最佳实践。