我正在使用 Realm 在我的Android Application
中database
。但是当我尝试从Runnable
中添加/删除RealmChangeListener
时,我得到了exception
.
java.lang.IllegalStateException:您无法删除/注册侦听器 从非 Looper 线程
如果我不使用 Runnable 它工作正常。以下是我的代码:
public void clearDatabase(final RealmChangeListener realmChangeListener) {
Realm realm = RealmManager.getNewInstance().getRealm();
realm.addChangeListener(realmChangeListener);
realm.beginTransaction();
realm.clear(RBooking.class);
realm.commitTransaction();
}
工作代码:
protected void clearData() {
mDatabaseManager.clearDataBase(new RealmChangeListener() {
@Override
public void onChange() {
TLog.d("Feb 23 : Database has been clean completed!");
}
});
}
编辑:更新不起作用的代码:
protected void processLogout() {
Runnable runnable = new Runnable() {
@Override
public void run() {
Looper.prepare();
mDatabaseManager.clearDataBase(new RealmChangeListener() {
@Override
public void onChange() {
TLog.d("Feb 23 : Database has been clean completed!");
}
});
Looper.loop();
}
};
doTask(runnable); // excute the runnable
}
因此,任何机构都可以帮助我使 RealmChangeListener 在 Runnable 上正确工作。谢谢。
调用 Looper.loop()
实际上会阻塞线程,因为该行是开始处理线程上事件队列的行,因此这就是您的示例不起作用的原因。
还不完全清楚为什么在这种情况下需要一个 RealmChangeListener?,但是如果你真的需要它们,你可以使用 HandlerThread
: http://developer.android.com/reference/android/os/HandlerThread.html 而不是普通的Thread
。HandlerThread有一个循环器,因此更改侦听器将处理这些。
使用当前传递给方法doTask()
可运行代码创建一个处理程序。然后在工作线程中调用处理程序。以便该可运行对象在 UI 线程中执行。
喜欢:
private Handler messageHandler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
mDatabaseManager.clearDataBase(new RealmChangeListener() {
@Override
public void onChange() {
TLog.d("Feb 23 : Database has been clean completed!");
}
});
}
};
然后在工作线程中调用此处理程序:
new Thread() {
public void run() {
messageHandler.sendEmptyMessage(0);
}
}.start();