如何在java firebase中运行异步方法

问题描述 投票:0回答:1

我想将用户的详细信息存储到 firebase 数据库中,但我想首先将图像存储到 storageRef 中,然后使用在最终注册之前作为我的个人资料图像链接返回的图像 url。我遇到的问题是,在返回图像 url 之前,还会通过返回 null 作为我的个人资料图像来执行存储完整信息的方法。我正在寻找一种方法,让 registerStudent 方法等到应用程序成功上传图像后才开始执行,以便它可以使用返回的图像 url 作为用户的个人资料图像。这是我尝试过的

private void uploadProfileImage(String regNumber, Uri imageUri, ProgressDialog progressDialog){
        if (imageUri !=null){
            final StorageReference fileRef = profileImageStorageRef
                    .child(regNumber+".jpg");
            StorageTask uploadTask = fileRef.putFile(imageUri);
            uploadTask.continueWithTask(new Continuation() {
                @Override
                public Object then(@NonNull Task task) throws Exception {
                    if (!task.isSuccessful()){
                        progressDialog.dismiss();
                        throw task.getException();
                    }
                    return fileRef.getDownloadUrl();
                }
            }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                @Override
                public void onComplete(@NonNull Task<Uri> task) {
                    if (task.isSuccessful()){
                        Uri downloadUri = task.getResult();
                        myUri = downloadUri.toString();
                    }
                }
            });
        }
    }

private void registerStudent(StudentModel studentModel,ProgressDialog progressDialog){
        HashMap hashMap = new HashMap<>();
        hashMap.put("name",studentModel.getName());
        hashMap.put("regNumber",studentModel.getRegNumber());
        hashMap.put("gender",studentModel.getGender());
        hashMap.put("testScore",studentModel.getTestScore());
        hashMap.put("profileImage",myUri);
        hashMap.put("testStatus",studentModel.getTestStatus());

        firebaseDatabase.getReference().child("Students")
                .child(studentModel.getRegNumber())
                .updateChildren(hashMap)
                .addOnCompleteListener(new OnCompleteListener() {
                    @Override
                    public void onComplete(@NonNull Task task) {
                        if (task.isSuccessful()){
                            progressDialog.dismiss();
                            Toast.makeText(application, "Registration Successful", Toast.LENGTH_SHORT).show();
                        }else {
                            progressDialog.dismiss();
                            Toast.makeText(application, "Error Occurred, Please Try Again", Toast.LENGTH_SHORT).show();
                        }
                    }
                });

    }


public void processStudentRegistration(StudentModel studentModel,Uri imageUri, ProgressDialog progressDialog,Activity activity){
        progressDialog.setTitle("Registration Processing....");
        progressDialog.setMessage("Please wait while we are checking your credentials");
        progressDialog.setCanceledOnTouchOutside(false);
        progressDialog.show();
        firebaseDatabase.getReference().child("Registration Number")
                .child(studentModel.getRegNumber())
                .addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        if (snapshot.exists()){
                            firebaseDatabase.getReference().child("Students").child(studentModel.getRegNumber())
                                    .addListenerForSingleValueEvent(new ValueEventListener() {
                                        @Override
                                        public void onDataChange(@NonNull DataSnapshot snapshot) {
                                            if (snapshot.exists()){
                                                progressDialog.dismiss();
                                                showMessage("Error","Student with this Registration Number has Already Registered",activity);
                                            }else {
                                                uploadProfileImage(studentModel.getRegNumber(),imageUri,progressDialog);
                                                registerStudent(studentModel,progressDialog);
                                            }
                                        }

                                        @Override
                                        public void onCancelled(@NonNull DatabaseError error) {

                                        }
                                    });
                        }else {
                            progressDialog.dismiss();
                            showMessage("Error","You are not qualified to Register for this course",activity);
                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {
                        Toast.makeText(application, error.toString(), Toast.LENGTH_SHORT).show();
                    }
                });

    }
java android firebase firebase-realtime-database firebase-storage
1个回答
0
投票

您可以通过确保在

registerStudent
成功完成后运行
registerStudent
来解决此问题。 这是实现它的方法: 创建一个接口/回调来处理图像上传完成:

public interface ImageUploadCallback {
    void onImageUploadSuccess(String imageUrl);
    void onImageUploadFailure(String errorMessage);
}

然后将

uploadProfileImage
修改为:

private void uploadProfileImage(String regNumber, Uri imageUri, ProgressDialog progressDialog, ImageUploadCallback callback) {
    if (imageUri != null) {
        final StorageReference fileRef = profileImageStorageRef.child(regNumber + ".jpg");
        StorageTask<UploadTask.TaskSnapshot> uploadTask = fileRef.putFile(imageUri);

        uploadTask.continueWithTask(task -> {
            if (!task.isSuccessful()) {
                progressDialog.dismiss();
                throw task.getException();
            }
            return fileRef.getDownloadUrl();
        }).addOnCompleteListener(task -> {
            if (task.isSuccessful()) {
                Uri downloadUri = task.getResult();
                if (downloadUri != null) {
                    String imageUrl = downloadUri.toString();
                    callback.onImageUploadSuccess(imageUrl); // Image upload success, pass the URL
                } else {
                    callback.onImageUploadFailure("Failed to get image URL");
                }
            } else {
                callback.onImageUploadFailure("Image upload failed");
            }
        });
    }
}

最后修改

processStudentRegistration
使其能够像这样处理回调:

public void processStudentRegistration(StudentModel studentModel, Uri imageUri, ProgressDialog progressDialog, Activity activity) {
    // ... (other existing code remains the same)

    uploadProfileImage(studentModel.getRegNumber(), imageUri, progressDialog, new ImageUploadCallback() {
        @Override
        public void onImageUploadSuccess(String imageUrl) {
            studentModel.setProfileImage(imageUrl); // Set the image URL in the student model

            registerStudent(studentModel, progressDialog);
        }

        @Override
        public void onImageUploadFailure(String errorMessage) {
            progressDialog.dismiss();
            showMessage("Error", errorMessage, activity);
        }
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.