La fonction fetchData
se trouve dans un fragment. La classe dataRepository
contient la fonction que j'utilise pour récupérer des données à partir du disque:L'instance de domaine a déjà été fermée, ce qui la rend inutilisable.
@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));
}
});
}
La classe 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();
}
}
}
La classe 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);
}
}
La première fois que l'application fonctionne bien, mais quand je quitte l'application et l'ouvre à nouveau, il se bloque et donne une erreur en disant This Realm instance has already been closed
, le rendant inutilisable. Cela fonctionne parfaitement bien si je saute le realm.close
à la fin. Dois-je fermer manuellement l'objet de domaine, si oui, comment? Pour une raison quelconque, realm==null
renvoie vrai lorsque je ferme l'application et l'ouvre à nouveau, pourquoi fait-elle cela, d'autant plus que realm.getdefaultinstance
est appelée juste avant elle.
vous déplacer en close() '' à onDestroyView() ' – EpicPandaForce
@EpicPandaForce qui ne marchait pas, le oncreateView est appelé à chaque fois que l'application ouvre alors realm = Realm.getDefaultInstance(); est exécuté mais le royaume reste toujours nul pour une raison quelconque. –
La réponse semble être ici: https://github.com/realm/realm-java/issues/4149#issuecomment-277949679 –