Realm :在 Runnable 中使用 RealmChangeListener



我正在使用 Realm 在我的Android Applicationdatabase。但是当我尝试从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();

相关内容

  • 没有找到相关文章

最新更新