因此,我尝试使用“共享首选项”中的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();
最佳答案
您现在不能使用尚未加载的内容。换句话说,您不能简单地将animalList
创建为全局变量并在onDataChange()
方法之外使用它,因为由于该方法的异步行为,它将始终为empty
。这意味着,当您尝试在该方法之外使用该列表时,数据尚未从数据库中加载完毕,因此无法访问。快速解决此问题的方法是仅在onDataChange()
方法内使用该列表,否则,我建议您从此post中查看anwser的最后一部分,在该部分中,我详细介绍了如何使用自定义回调进行操作。您也可以查看此video以获得更好的理解。