2017-02-05 5 views
0

Die Funktion fetchData ist in einem Fragment. Die dataRepository Klasse enthält die Funktion, die i verwenden, um Daten von der Platte zu holen:Realm-Instanz wurde bereits geschlossen, wodurch sie unbrauchbar wird

@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)); 
       } 
      }); 
} 

Die DataRepository Klasse:

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(); 
    } 
} 
} 

Die UserDiskData Klasse:

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); 
} 

}

Das erste Mal läuft die App gut, aber wenn ich die App verlasse und wieder öffne, geht es stürzt ab und gibt einen Fehler, der This Realm instance has already been closed sagt, es unbrauchbar machend. Es funktioniert völlig in Ordnung, wenn ich die realm.close am Ende auslassen. Sollte ich das Realm-Objekt manuell schließen, wenn ja, wie? Aus irgendeinem Grund realm==null gibt True zurück, wenn ich die App schließe und es wieder öffne, warum tut es das, besonders wenn man bedenkt, dass realm.getdefaultinstance direkt davor aufgerufen wird.

+0

move 'close()' zu 'onDestroyView()' – EpicPandaForce

+0

@EpicPandaForce das nicht funktioniert, wird die oncreateView jedes Mal aufgerufen, wenn die App geöffnet wird so realm = Realm.getDefaultInstance(); Wird ausgeführt, aber Realm bleibt aus irgendeinem Grund gleich Null. –

+0

Antwort scheint hier zu sein: https://github.com/realm/realm-java/issues/4149#issuecomment-277949679 –

Antwort

1

Mein Kollege @ zaki50 betont:

DataRepository einen statischen Bezug auf PoliticoDataRepository hält. Das bedeutet, dass DataRepository.getInstance(Realm realm) eine alte Instanz von PoliticoDataRepository zurückgeben kann, die die geschlossene Realm-Instanz enthält.

Sie müssen das statische Feld entfernen und sicherstellen, dass DataRepository.getInstance(Realm realm) immer eine Instanz zurückgibt, die sich auf die übergebene Realm-Instanz bezieht.

Verwandte Themen