我在Firebase上的共享首选项中保存了一些数据,以防万一应用程序数据被删除,我需要从Firebase中获取数据,如果共享首选项和Firebase中都不存在该数据,则返回null。 >
问题是该方法不等待Firebase返回数据并返回null。 我试过了这个solution并且我也返回了null,我想是因为该函数结尾处的return,但是当我删除它时,出现了“缺少返回语句”错误。
有什么想法要解决吗?
我的原始代码:
public ArrayList<News> getFavorites() {
SharedPreferences sharedPreferences;
sharedPreferences = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
favoritesArrayList = new ArrayList<>();
if (sharedPreferences.contains(FAVORITES)) {
String json = sharedPreferences.getString(FAVORITES, null);
Gson gson = new Gson();
News[] newsArray = gson.fromJson(json, News[].class);
favoritesArrayList = new ArrayList<News>(Arrays.asList(newsArray));
Helper.displayLog("s", "shared pref:" + favoritesArrayList.size());
return favoritesArrayList;
} else {
//check if in firebase
Constants.favoritesDatabaseReference.child(Constants.currentUser.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
for(DataSnapshot ds:dataSnapshot.getChildren()){
favoritesArrayList.add(ds.getValue(News.class));
}
}
else
favoritesArrayList=null;
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
return favoritesArrayList;
}
尝试解决方案后的代码:
public ArrayList<News> getFavorites() {
SharedPreferences sharedPreferences;
sharedPreferences = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
favoritesArrayList = new ArrayList<>();
if (sharedPreferences.contains(FAVORITES)) {
String json = sharedPreferences.getString(FAVORITES, null);
Gson gson = new Gson();
News[] newsArray = gson.fromJson(json, News[].class);
favoritesArrayList = new ArrayList<News>(Arrays.asList(newsArray));
Helper.displayLog("s", "shared pref:" + favoritesArrayList.size());
return favoritesArrayList;
} else {
//check if in firebase
getNewsFromFirebase(new CallBack() {
@Override
public ArrayList<News> onCallback(ArrayList<News> newsArrayList) {
return favoritesArrayList=newsArrayList;
}
});
}
return favoritesArrayList;
}
private void getNewsFromFirebase(final CallBack callBack){
Constants.favoritesDatabaseReference.child(Constants.currentUser.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
for(DataSnapshot ds:dataSnapshot.getChildren()){
favoritesArrayList.add(ds.getValue(News.class));
}
callBack.onCallback(favoritesArrayList);
Helper.displayLog(context.getClass().getSimpleName(),"SP class "+"list size: "+favoritesArrayList.size());
}
else
favoritesArrayList=null;
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
private interface CallBack {
ArrayList<News> onCallback(ArrayList<News> newsArrayList);
}