从不正确的线程

时间:2017-02-09 14:06:04

标签: java android multithreading realm

您好我在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();
    }

2 个答案:

答案 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