领域错误:您的领域是从没有Looper的线程打开的,并且您提供了回调,我们需要一个Handler来调用您的回调

时间:2016-11-10 16:34:04

标签: android multithreading realm rx-java

我已在订阅者的onComplete()方法中创建了此代码:

long size, perc;
    public void onCompleted()
    {
        Log.wtf("on complete","On complete");
        realm = Realm.getInstance(defaultConfig);
        realm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm mRealm) {
                AirportR airport = new AirportR();

                size = airp.size();
                Log.d("size:", String.valueOf(size));

                for (int i = 0; i < airp.size(); i++)
                {
                    airport.setId(Integer.parseInt(airp.get(i).getId()));

                    perc = i / size * 100;
                    Log.d("i + percentage", String.valueOf(i) + " - " + String.valueOf(perc));

                    mRealm.insertOrUpdate(airport);
                }
            }
        }, new Realm.Transaction.OnSuccess() {
            @Override
            public void onSuccess()
            {
            }
        }, new Realm.Transaction.OnError() {
            public void onError(Throwable error) {
                error.printStackTrace();
            }
        });
    }

当我使用调试器时,我看到以下错误消息:

java.lang.IllegalStateException: Your Realm is opened from a thread without a Looper and you provided a callback, we need a Handler to invoke your callback

我看到如果我不使用Transaction.Success()Transaction.OnError(),那么效果很好,如果我使用它们,我只会遇到这个问题。

有没有办法解决它?

由于

1 个答案:

答案 0 :(得分:2)

onCompleted()似乎没有在UI线程上运行。调度程序上的普通后台线程没有looper,因此当异步事务完成时,Realm无法通知它。

您应该使用executeTransaction()因为您已经在后台线程上,或者只是从looper线程(例如UI线程)运行executeTransactionAsync()