我在我database
的{{1}}中使用Realm。
但是,当我尝试从Android Application
添加/删除RealmChangeListener
时,我获得了Runnable
。
java.lang.IllegalStateException:您无法删除/注册侦听器 来自非Looper线程
如果我不使用Runnable,它可以正常工作。 以下是我的代码:
exception
工作代码:
public void clearDatabase(final RealmChangeListener realmChangeListener) {
Realm realm = RealmManager.getNewInstance().getRealm();
realm.addChangeListener(realmChangeListener);
realm.beginTransaction();
realm.clear(RBooking.class);
realm.commitTransaction();
}
编辑:更新 NOT 工作代码:
protected void clearData() {
mDatabaseManager.clearDataBase(new RealmChangeListener() {
@Override
public void onChange() {
TLog.d("Feb 23 : Database has been clean completed!");
}
});
}
因此,任何正文都可以帮助我使RealmChangeListener在Runnable上正确工作。谢谢。
答案 0 :(得分:1)
调用Loop.loop()
实际上会阻塞该线程,因为该行是开始处理该线程上的事件队列的行,因此这就是您的示例不起作用的原因。
在这种情况下,为什么你需要一个RealmChangeListener并不完全清楚?但是如果你真的需要它们,你可以使用HandlerThread
:http://developer.android.com/reference/android/os/HandlerThread.html而不是普通的Thread
。 HandlerThread有一个looper,所以改变听众会对它们有所帮助。
答案 1 :(得分:0)
使用当前传递给doTask()
方法的可运行代码创建一个处理程序。然后在你的工作线程中调用处理程序。这样runnable就可以在UI Thread中执行。
喜欢:
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();