Функция fetchData
находится во фрагменте. dataRepository
класс содержит функцию, которая я использовать для выборки данных с диска:Экземпляр Realm уже закрыт, что делает его непригодным
@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
вызывается прямо перед ним.
Переместить 'close()' to' onDestroyView() ' – EpicPandaForce
@EpicPandaForce, который не работал, oncreateView вызывается каждый раз, когда приложение открывается, так что realm = Realm.getDefaultInstance(); выполняется, но по какой-то причине область по-прежнему остается нулевой. –
Ответ, кажется, здесь: https://github.com/realm/realm-java/issues/4149#issuecomment-277949679 –