等待Firebase数据获取后从方法返回数据

时间:2018-07-16 11:28:46

标签: android firebase firebase-realtime-database

我在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);
    }

0 个答案:

没有答案