我正在为database中的Android Application使用Realm
但是,当我尝试从RealmChangeListener添加/删除Runnable时,我得到了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上正常工作。谢谢。

最佳答案

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

目前尚不清楚为什么在这种情况下需要RealmChangeListener吗?但是,如果确实需要RealmChangeListener,则可以使用HandlerThreadhttp://developer.android.com/reference/android/os/HandlerThread.html代替普通的Thread。 HandlerThread有一个循环程序,因此更改侦听器将对此起作用。

08-17 11:36