2017-02-05 13 views
0

Функция 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 вызывается прямо перед ним.

+0

Переместить 'close()' to' onDestroyView() ' – EpicPandaForce

+0

@EpicPandaForce, который не работал, oncreateView вызывается каждый раз, когда приложение открывается, так что realm = Realm.getDefaultInstance(); выполняется, но по какой-то причине область по-прежнему остается нулевой. –

+0

Ответ, кажется, здесь: https://github.com/realm/realm-java/issues/4149#issuecomment-277949679 –

ответ

1

Мой коллега @ zaki50 указывает:

DataRepository сохраняет статический ссылку на PoliticoDataRepository. Это означает, что DataRepository.getInstance(Realm realm) может вернуть старый экземпляр PoliticoDataRepository, который содержит закрытый экземпляр Realm.

Необходимо удалить статическое поле и убедиться, что DataRepository.getInstance(Realm realm) всегда возвращает экземпляр, который ссылается на переданный экземпляр Realm.

 Смежные вопросы

  • Нет связанных вопросов^_^