Android SharedPreferences onSharedPreferenceChanged не срабатывает - PullRequest
0 голосов
/ 08 мая 2018

Поэтому я пытаюсь передать объекты между действиями с помощью onSharedPreferenceChanged в общих настройках:

В одном классе занятий я называю префы так:

 mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
 mPrefs.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() {
        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
            getData();
        }
    });

public void getData(){
    Gson gson = new Gson();
    String json = mPrefs.getString("ListAnimals", "");
    ArrayList<SpottedAnimal> animalList = gson.fromJson(json, ArrayList.class);
}

fireClient = new FirebaseClient(context:this, mPrefs);

А затем в FirebaseClient я вызываю singleValueEventListener для получения всех данных из БД.

 Query query = mDatabase.orderByChild("id");
 query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for(DataSnapshot ds :dataSnapshot.getChildren()){
                 final  DataSnapshot dataSnap = ds;
                 String id = dataSnap.child("id").getValue(String.class); 
                 mStorageRef.child("picture_Thumb"+id).
                 getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {
                             SpottedAnimal pet = dataSnap.getValue(SpottedAnimal.class);
                             pet.setPictureIDThumb(uri.toString());
                             animalList.add(pet);
                             saveList();
                }
        }

 public void saveList(){
    String listJson = gson.toJson(animalList);
    prefsEditor.putString("ListAnimals", listJson);
    prefsEditor.commit();
}

Пока это в основном тест, я собираюсь использовать onChildEvent, но все же, когда все данные извлекаются с сервера, он должен по крайней мере несколько раз вызывать onSharedPreferenceChanged.

Также в конструкторе FirebaseClient я получаю Prefs из класса активности:

    this.mPrefs=mPrefs;
    prefsEditor = mPrefs.edit();

1 Ответ

0 голосов
/ 08 мая 2018

Вы не можете использовать что-то, что еще не было загружено. Другими словами, вы не можете просто создать animalList как глобальную переменную и использовать его вне метода onDataChange(), потому что он всегда будет empty из-за асинхронного поведения этого метода. Это означает, что к тому времени, когда вы пытаетесь использовать этот список за пределами этого метода, данные еще не закончили загрузку из базы данных, и поэтому они недоступны. Быстрое решение этой проблемы - использовать этот список только внутри метода onDataChange(), в противном случае я рекомендую вам увидеть последнюю часть моего ответа из этого поста , в котором я имею объяснил, как это можно сделать с помощью пользовательского обратного вызова. Вы также можете взглянуть на это видео для лучшего понимания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...