【问题标题】:Android SharedPreferences onSharedPreferenceChanged not getting triggeredAndroid SharedPreferences onSharedPreferenceChanged 没有被触发
【发布时间】:2018-05-08 20:28:54
【问题描述】:

所以我尝试使用共享首选项中的 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();

【问题讨论】:

    标签: java android firebase firebase-realtime-database sharedpreferences


    【解决方案1】:

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

    【讨论】:

    • 是的,但这就是为什么 saveList() 位于 onDataChange() 中的原因,因此它只是在将对象添加到其中之后才“触发”提交。并且据说 onSharedPreferenceChanged 仅在提交之后被调用。
    • 尝试像这样定义方法:public void saveList(ArrayList&lt;SpottedAnimal&gt; animalList),然后像这样从onDataChange()调用它:saveList(animalList);。现在可以用了吗?
    • 没有没有工作,仍然没有被触发。这些对象确实被提交了,因为我尝试在 FirebaseClient 端使用日志检查它们,但在另一端没有任何结果。
    猜你喜欢
    • 1970-01-01
    • 2014-06-22
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    相关资源
    最近更新 更多