2

我正在databaseAndroid Application. 但是当我尝试RealmChangeListener从 a添加/删除时,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 上正确工作。谢谢你。

4

2 回答 2

2

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

目前尚不完全清楚为什么在这种情况下需要 RealmChangeListener?,但如果你真的需要它们,你可以使用HandlerThread:http: //developer.android.com/reference/android/os/HandlerThread.html而不是普通的Thread. HandlerThread 有一个循环器,因此更改侦听器可以处理这些。

于 2016-02-26T11:02:57.673 回答
0

使用您当前传递给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();
于 2016-02-26T09:48:18.437 回答