2017-02-05 3 views
0

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.

+0

vous déplacer en close() '' à onDestroyView() ' – EpicPandaForce

+0

@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. –

+0

La réponse semble être ici: https://github.com/realm/realm-java/issues/4149#issuecomment-277949679 –

Répondre

1

Mon collègue @ zaki50 souligne:

DataRepository conserve une référence statique -PoliticoDataRepository. Cela signifie que DataRepository.getInstance(Realm realm) peut renvoyer une ancienne instance de PoliticoDataRepository qui contient l'instance de domaine fermée.

Vous devez supprimer le champ statique et vous assurer que DataRepository.getInstance(Realm realm) renvoie toujours une instance qui fait référence à l'instance de domaine transmise.