首页 > 解决方案 > Android SharedPreferences onSharedPreferenceChanged 没有被触发

问题描述

所以我试图在共享首选项中使用 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 构造函数中,我从活动类中获取首选项:

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

标签: javaandroidfirebasefirebase-realtime-databasesharedpreferences

解决方案


您现在不能使用尚未加载的东西。换句话说,您不能简单地创建animalList一个全局变量并在onDataChange()方法之外使用它,因为它总是empty由于此方法的异步行为。这意味着当您尝试在该方法之外使用该列表时,数据尚未完成从数据库加载,这就是无法访问的原因。解决此问题的一个快速方法是仅在方法内部使用该列表,否则我建议您从这篇文章onDataChange()中查看我的 anwser 的最后一部分,其中我已经解释了如何使用自定义回调来完成它。您也可以观看此视频以更好地理解。


推荐阅读