Прежде чем продолжить, дождитесь завершения метода - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь запустить метод с именем uploadProfilePhoto () , но код после вызова этого метода запускается первым, даже если uploadProfilePhoto () не завершен sh. Могу ли я в любом случае разрешить uploadProfilePhoto () fini sh, прежде чем продолжить, это процесс?

Я пытался использовать AsynTask, но он все еще не работает. Похоже, это потому, что doInBackground () для серии кода, а не метода.

AsyncTask

protected class MyAsyncTask extends AsyncTask<Void, Void, Void>
{
    @Override
    protected Void doInBackground(Void... params) {
        uploadProfilePhoto();
        return null;
    }
    @Override
    protected void onPostExecute(Void result) {
        Toast.makeText(ProfileSetup.this, "Account created successfully.", Toast.LENGTH_SHORT).show();
        mAuth.signInWithEmailAndPassword(email, password);
        startActivity(new Intent(ProfileSetup.this, MainActivity.class));
    }
}

uploadProfilePhoto ()

private void uploadProfilePhoto() {

    if (mImageUri != null) {
        final StorageReference imageReference = storageReference.child(System.currentTimeMillis() + "." + getFileExtension(mImageUri));

        storageTask = imageReference.putFile(mImageUri);
        storageTask.continueWithTask(new Continuation() {
            @Override
            public Task<Uri> then(@NonNull Task task) throws Exception {
                if (!task.isSuccessful()) {
                    throw task.getException();
                }
                return imageReference.getDownloadUrl();
            }
        }).addOnCompleteListener(new OnCompleteListener<Uri>() {
            @Override
            public void onComplete(@NonNull Task<Uri> task) {
                if (task.isSuccessful()) {
                    Uri downloadUri = task.getResult();
                    myUrl = downloadUri.toString();

                    String myid = getIntent().getStringExtra("uid");

                    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users").child(myid);
                    reference.child("profilePicUrl").setValue(myUrl);
                    finish();
                } else {
                    Toast.makeText(ProfileSetup.this, "Failed", Toast.LENGTH_SHORT).show();
                }
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(ProfileSetup.this, e.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    } else {
        Toast.makeText(this, "No image selected", Toast.LENGTH_SHORT).show();
    }
}

1 Ответ

0 голосов
/ 24 марта 2020

Я могу думать о двух способах

 storageTask = imageReference.putFile(mImageUri);
    storageTask.addOnCompleteListener(new OnCompleteListener<Uri>() {
        @Override
        public void onComplete(@NonNull Task<Uri> task) {
            if (task.isSuccessful()) {
                myUrl = task.getResult().toString();
                String myid = getIntent().getStringExtra("uid");
                DatabaseReference reference = 
                FirebaseDatabase.getInstance().getReference("Users").child(myid);
                reference.child("profilePicUrl").setValue(myUrl);
                startActivity(new Intent(ProfileSetup.this, MainActivity.class));
                finish();
            } else {
                Toast.makeText(ProfileSetup.this, "Failed", 
                Toast.LENGTH_SHORT).show();
            }
        }

2-й способ, который не очень чистый и приятный на самом деле, должен рассматриваться как плохая практика, но знание альтернативного пути не причиняет вреда, поэтому

Вы можете сразу запустить MainActivity после произнесения imageReference.putFlie(mImageUri);

imgeReference.putFile(mImageUri);
startActivity(new Intent(ProfileSetup.this, MainActivity.class));

Теперь в MainActivity

while(ProfileSetup.getImageUrl() == null){ // define a method to return the url
       Systemclock.sleep(500);            // if it is small image you can hote it will be uplaoded in seconds      
}
Picasso.with(this).load(ProfileSetup.getImageUrl()).fit().into(imageView); // the while loop terminates when your image gets uploaded because getImageUrl() did not return null , now you know image is there you can download and set it to imageView by using Piccaso 

При таком подходе вам не нужен completeListener, но я не рекомендую делать это потому что он более сложный и не работает с ошибкой imageUploading

...