java - Realm 实例已经关闭,无法使用

标签 java android realm observable rx-java2

fetchData 函数在 fragment 中。 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 对象吗?如果是的话如何? 出于某种原因 realm==null 在我关闭应用程序并再次打开它时返回 true,为什么它会这样做,特别是考虑到 realm.getdefaultinstance 在它之前被调用.

最佳答案

我的同事@zaki50 指出:

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

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

关于java - Realm 实例已经关闭,无法使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42057566/

相关文章:

android - 父类(super class)android生命周期

swift - Realm 异步线程 Swift 3

java - Java 中的 servlet

Java 文件加密

android - VideoView/MediaPlayer 在最后一帧停止

android - 使用 Android Realm 存储 LatLng

swift - 网络连接丢失错误

java - 表格 :form tag declares that it accepts dynamic attributes but does not implement the required interface

java - 在 json 中插入/显示/加载崩溃

jack 的 Android 编译时间非常慢