【问题标题】:Realm instance has already been closed, making it unusable领域实例已关闭,使其无法使用
【发布时间】:2017-02-05 21:33:09
【问题描述】:

函数fetchData 在片段中。 dataRepository 类包含我用来从磁盘获取数据的函数:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.fragment_user, container, false);

    realm = Realm.getDefaultInstance();

    Log.i("realm", "oncreateView");

    items = new ArrayList<>();

    try {
        Log.i("realm", "check" + (realm == null));
    } catch (Exception e) {
        e.printStackTrace();
    }

    fetchData();

    return view;
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (realm != null && !realm.isClosed())
        realm.close();
    Log.i("realm", "ondestroy");
}

    private void fetchData() {

    abcDataRepository = DataRepository.getInstance(realm);

    Observable<List<User>> observable = bcDataRepository.getUser_List();

    observable.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(Users-> {
                Log.i("data", Users.size() + "");

                for (int i = 0; i < Users.size(); i++) {
                    items.add(Users.get(i));
                }
            });
}

DataRepository 类:

public class DataRepository {

    private Realm realm;

private static PoliticoDataRepository dataRepository = null;

private PoliticoDataRepository(Realm realm) {
    this.realm = realm;
}

public static PoliticoDataRepository getInstance(Realm realm) {
    if (dataRepository == null)
        dataRepository = new PoliticoDataRepository(realm);

    return dataRepository;
}

@Override
public Observable<List<User>> getUser_List() {

    final UserDiskData diskData = new UserDiskData(realm);

    if (diskData.User_Size() > 0) {
        return diskData.getUser_List();
    } else {
        final UserCloudData cloudData = new UserCloudData(realm);
        return cloudData.getUser_List();
    }
}
}

UserDiskData 类:

class  UserDiskData {

private Realm realm;

UserDiskData(Realm realm) {
    this.realm = realm;
}

int User_Size() {
    final RealmResults<User> results = realm.where(User.class).findAll();
    Log.i("disk", "pulledData" + results.size());
    return results.size();
}

@Override
public Observable<List<User>> getUser_List() {

    Log.i("disk", "called");

    final RealmResults<User> results = realm.where(User.class).findAll();
    ArrayList<User> list = new ArrayList<>();
    for (int i = 0; i < results.size(); i++)
        list.add(results.get(i));

    return Observable.just(list);
}

}

应用程序第一次运行良好,但当我退出应用程序并再次打开它时,它崩溃并给出错误提示This Realm instance has already been closed,使其无法使用。 如果我最后跳过realm.close,它工作得很好。我应该手动关闭领域对象吗,如果是的话怎么办? 出于某种原因,realm==null 在我关闭应用程序并再次打开它时返回 true,为什么它会这样做,特别是考虑到 realm.getdefaultinstance 在它之前被调用。

【问题讨论】:

标签: java android realm observable rx-java2


【解决方案1】:

我的同事@zaki50 指出:

DataRepository 保持对PoliticoDataRepository静态 引用。这意味着DataRepository.getInstance(Realm realm) 可以返回一个旧的PoliticoDataRepository 实例,其中包含已关闭的Realm 实例。

您必须删除静态字段并确保 DataRepository.getInstance(Realm realm) 始终返回引用传递的 Realm 实例的实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多