繁体   English   中英

在启动屏幕期间获取用户数据,并将其传递给下一个活动

[英]Fetch user data during splash screen and pass it to next activity

我正在开发一个Android应用程序,其中需要在应用程序的启动屏幕期间从Firestore检索数据,并使用该文档快照中的特定值来检索另一个文档。 为此,我需要从Firebase的get()函数中获取字符串值。 但是当我尝试这样做时,我没有从函数中获取变量的值:

String userCityL;
    DocumentReference docRef = firestoreDB.collection("users").document(mail);
    docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            if (task.isSuccessful()) {
                DocumentSnapshot document = task.getResult();
                String userCityL;
                if (document.exists()) {
                    Log.d(TAG, "DocumentSnapshot data: " + document.getData());

                    userNameL = document.getString("UserName");
                    userPhoneL = document.getString("UserPhoneNo");
                    userDegreeL = document.getString("UserDegree");
                    userSpecialL = document.getString("UserSpecial");
                    userCityL = document.getString("UserCity");
                    userProfilePicL = document.getString("downloadUri");

                    TextView userCity = findViewById(R.id.tvCity);
                    userCity.setText(userCityL);

                    //loadNotesList();

                    //dummy(userCityL);

                    //loadNotesList(userCityL);

                } else {
                    Log.d(TAG, "No such document");
                }
            } else {
                Log.d(TAG, "get failed with ", task.getException());
            }
        }
    });

在此, userCityL变量中未存储任何内容。

您不会在onComplete()函数之外而不是在get()函数之外get()该String的值。 发生这种情况是因为onComplete()函数具有异步行为。 您也不能简单地创建一个全局变量并在函数外使用它的值,因为它始终为null 如果要使用onDataChange()方法之外的来自数据库的值,则有两种选择。 第一个方法是将所需的对象作为参数传递给您的类中定义的方法,如下所示:

docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document.exists()) {
                String userCityL = document.getString("UserCity");
                methodThatDoesSomething(userCityL); //Method call

            } else {
                Log.d(TAG, "No such document");
            }
        } else {
            Log.d(TAG, "get failed with ", task.getException());
        }
    }
});

private void methodThatDoesSomething(String userCityL) {
    //Do what you need to do with your userCityL object
}

或者,如果你想在一个更复杂的方式,然后潜入的现代API的异步世界,看到我在这个答案的最后一部分 ,在我所一步解释一步如何您可以使用自定义的回调实现这一目标。 有关更多信息,您也可以观看此视频

是的,但是您可能会在从函数中获取结果之前调用该字符串。

尝试将函数放在调用函数内部字符串的位置。

查看Alex Mamo的视频,那里有您的解释。

我使用“共享首选项”解决了这个问题。 我的问题是获取当前登录用户的用户数据,并在所有活动中的整个应用程序中使用此数据。 在这里,我在启动屏幕期间从Firebase提取数据,并将其存储在共享首选项文件中,并在其他活动中使用这些数据。 谢谢 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM