我已在订阅者的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()
,那么效果很好,如果我使用它们,我只会遇到这个问题。
有没有办法解决它?
由于
答案 0 :(得分:2)
onCompleted()
似乎没有在UI线程上运行。调度程序上的普通后台线程没有looper,因此当异步事务完成时,Realm无法通知它。
您应该使用executeTransaction()
因为您已经在后台线程上,或者只是从looper线程(例如UI线程)运行executeTransactionAsync()
。