您好我在onCreate()上创建了一个领域我希望在doInBackground中公开class CheckerThread extends AsyncTask<Void, String, Boolean>
存储一个日期,但我有一个
java.lang.IllegalStateException:从错误的线程访问Realm。 Realm对象只能在创建它们的线程上访问。
onCreate我有这个:
realm = RealmController.with(this).getRealm();
接下来在AsynTask我下载了一个数据,我想保存这个,我想在doInBackground中这样做,但是当我这样做时,我有:
Caused by: java.lang.IllegalStateException: Realm access from incorrect thread. Realm instance can only be closed on the thread it was created.
我在doInBackground上这样做,但它没有帮助:
try {
realm = RealmController.with(getApplication()).getRealm();
RealmController.with(getApplication()).save(data);
}
finally {
realm.close();
}
RealmController;
public class RealmController {
private static RealmController instance;
private final Realm realm;
public RealmController(Application application) {
realm = Realm.getDefaultInstance();
}
public static RealmController with(Fragment fragment) {
if (instance == null) {
instance = new RealmController(fragment.getActivity().getApplication());
}
return instance;
}
public static RealmController with(Activity activity) {
if (instance == null) {
instance = new RealmController(activity.getApplication());
}
return instance;
}
public static RealmController with(Application application) {
if (instance == null) {
instance = new RealmController(application);
}
return instance;
}
public static RealmController getInstance() {
return instance;
}
public Realm getRealm() {
return realm;
}
//Refresh the realm istance
public void refresh() {
realm.refresh();
}
答案 0 :(得分:3)
如前所述here,不要访问在后台线程上运行的doInBackground()
内的UI线程上查询的托管RealmObjects。在try-finally
内使用doInBackground()
打开和关闭Realm实例,并根据其主键重新查询您的对象。
另外,抛出RealmController
,这是一个毫无意义的补充,基于写得不好的Ravi Tamada infohive Realm教程,它告诉你使用Realm 0.82.2,尽管该版本是2岁。它完全忽略了Realm实例是线程限制的事实,并且你将与它一起遇到IllegalStateException
,就像你现在一样。 Ravi Tamada侥幸逃脱,因为他在UI线程上执行所有写入事务,这通常是一个坏主意。
让我以大胆的方式说明, INFOHIVE REALM TUTORIAL是可怕的并且促进了不良行为。请勿使用。
您应该参考this repository获取正确的Realm教程。但您也可以查看my profile以获取与Realm相关的其他资源。
答案 1 :(得分:-1)
您似乎正在尝试访问在主线程上创建的对象。 AsyncTask为您提供了一个onPostExecution()方法,从这里您可以访问您的领域对象,但不能访问doInBackground()方法。在cas中,您想要从doInBackground()访问该对象,然后您可以使用Handler类。文档在下面的链接中提供。enter link description here