首页 > 解决方案 > 在函数中重新赋值后全局变量值赋值保持不变(Android Studio)

问题描述

程序员,我对android studio和java很陌生,在这种情况下,我正在尝试上传检索到的用户信息并将它们存储在firebase数据库中。检索过程成功,登录后可以看到检索URL。但是,String pathToProfile没有分配URL,当我检查日志时,它是空的。提前致谢!

全局声明:

String pathToProfile;
Map<String, Object> UserInfo = new HashMap<>();

检索下载 URL 的函数

// retrieved URL should be saved in user document
    private void retrieveProfileViaURL () {
        profileRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {
                pathToProfile = uri.toString();
                UserInfo.put(PROFILE_URL, pathToProfile);
                Log.d(TAG, "retrieve profile image successful" + pathToProfile);
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
                Log.d(TAG, "retrieve profile image failure");
                // pathToProfile = "uri download unsuccessful";
            }
        });
    }

将用户信息上传到firebase的功能

private void uploadUserInfo(String user, String bioInfo) {
        // CollectionReference users = db.collection("users");
        String UID = getUserID();
        retrieveProfileViaURL();

        // UserInfo.put(USERID, UID);
        UserInfo.put(USERNAME, user);
        UserInfo.put(BIO, bioInfo);


        mDocRef.collection("users").document(UID).set(UserInfo)
                .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                Log.d(USER_INFO, "Document has been saved");
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.w(USER_INFO, "Document was not saved!", e);
            }
        });
    }

标签: javaandroidgoogle-cloud-firestorefirebase-storage

解决方案


Firebase 数据库中的所有数据都是异步读取的。您无法在调用之外获取值。这就是为什么你的pathToProfile节目为空。

为了更好的方法,您可以尝试这样的方法。

用户上传数据后,它会自动允许用户使用 url 写入数据

private void retrieveProfileViaURL () {
    profileRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
        @Override
        public void onSuccess(Uri uri) {
            pathToProfile = uri.toString();
            String UID = getUserID();
            UserInfo.put(USERNAME, user);
            UserInfo.put(BIO, bioInfo);
            UserInfo.put(PROFILE_URL, pathToProfile);
            mDocRef.collection("users").document(UID).set(UserInfo)
                    .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    Log.d(USER_INFO, "Document has been saved");
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.w(USER_INFO, "Document was not saved!", e);
                }
            });
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            Log.d(TAG, "retrieve profile image failure");
            // pathToProfile = "uri download unsuccessful";
        }
    });
}

推荐阅读