领域:在Runnable中使用RealmChangeListener

时间:2016-02-26 09:40:54

标签: java android realm runnable android-looper

我在我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上正确工作。谢谢。

2 个答案:

答案 0 :(得分:1)

调用Loop.loop()实际上会阻塞该线程,因为该行是开始处理该线程上的事件队列的行,因此这就是您的示例不起作用的原因。

在这种情况下,为什么你需要一个RealmChangeListener并不完全清楚?但是如果你真的需要它们,你可以使用HandlerThreadhttp://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();