我以为我遵循推荐的Realm方法来运行像这样的异步数据插入:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="responsive1">
<div class="pop_background"></div>
<div class="pop_box">
<h1>POP1</h1>
<span class="close">×</span>
</div>
<div class="img">
<a class="open" href="#">
click to open pop
</a>
</div>
</div>
<div class="responsive1">
<div class="pop_background"></div>
<div class="pop_box">
<h1>POP2</h1>
<span class="close">×</span>
</div>
<div class="img">
<a class="open" href="#">
click to open pop2
</a>
</div>
</div>
然而,当我运行上面的代码时,我得到了#34;你的领域是从一个没有Looper的线程打开的,你提供了一个回调,我们需要一个Handler来调用你的回调&#34;
我在非Activity类中运行此代码,我在这里做错了,我该如何解决它。感谢。
更新 - 已修复 事实证明,查询没有任何问题,问题是我是从IntentService调用它。我试图在应用程序第一次运行时播种数据库,所以我修复了这个:
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();
}
修复后,在IntentService之外,从UI线程调用时,查询工作正常。
答案 0 :(得分:2)
为了
insertRealm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm backgroundRealm) {
//...
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
// !!!
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(Throwable error) {
// !!!
}
});
要在后台线程上调用的异步事务回调,该线程需要与Looper相关联(因此具有可与该Looper的线程通信的Handler)。
解决方案,在后台线程上使用同步事务。
但是你已经知道了。
protected void onHandleIntent(Intent intent) {
Realm realm = null;
try {
realm = Realm.getDefaultInstance();
final List<Customer> customers = SampleCustomerData.getCustomers();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
for (Customer customer: customers){
customer.setId(customerPrimaryKey.getAndIncrement());
realm.insert(customer);
}
}
});
} finally {
if(realm != null) {
realm.close();
}
}
}
答案 1 :(得分:1)
Realm依赖于Android&#39; Hanfler和Looper类的线程通信。 看起来你从另一个后台线程查询异步操作(为什么?,它已经在后台,使用同步版本)。 要解决此问题,您需要使用Active Looper的线程。使用Handler线程作为后台线程 - 它将初始化Looper
答案 2 :(得分:1)
您需要从UI线程调用 addCustomer 。
答案 3 :(得分:-1)
试试这一行
insertRealm.close();
在onSuccess
和onError
方法中添加。将它从当前的最后一行中删除。
所以你的代码看起来像
public void addCustomer(final Customer customer) {
final 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");
insertRealm.close();
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(Throwable error) {
Log.d(LOG_TAG, error.getMessage());
insertRealm.close();
}
});
}