【发布时间】:2016-11-05 05:54:50
【问题描述】:
我以为我正在遵循推荐的 Realm 方法来运行这样的异步数据插入:
public void addCustomer(final Customer customer) {
Realm insertRealm = Realm.getDefaultInstance();
insertRealm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm backgroundRealm) {
long id = customerPrimaryKey.incrementAndGet();
customer.setId(id);
backgroundRealm.copyToRealm(customer);
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
Log.d(LOG_TAG, "Customer Added");
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(Throwable error) {
Log.d(LOG_TAG, error.getMessage());
}
});
insertRealm.close();
}
但是,当我运行上面的代码时,我得到“你的领域是从一个没有 Looper 的线程打开的,并且你提供了一个回调,我们需要一个处理程序来调用你的回调”
我在非 Activity 类中运行此代码,我在这里做错了什么以及如何修复它。谢谢。
更新 - 已修复 事实证明查询没有问题,问题是我是从 IntentService 调用它的。我试图在应用程序首次运行时为数据库播种,所以我修复了这个问题:
protected void onHandleIntent(Intent intent) {
Realm realm = Realm.getDefaultInstance();
//Add sample Customers to database
List<Customer> customers = SampleCustomerData.getCustomers();
realm.beginTransaction();
for (Customer customer: customers){
customer.setId(customerPrimaryKey.getAndIncrement());
realm.copyToRealm(customer);
}
realm.commitTransaction();
realm.close();
}
已修复,在 IntentService 之外,从 UI 线程调用查询时可以正常工作。
【问题讨论】:
-
这是从 Presenter 类中调用的。我没有启动线程,我认为 Realm 会自旋一个线程来执行异步查询。