Функция OnComlete не вызывается после putfile в хранилище firebase - PullRequest
0 голосов
/ 07 июня 2018

Эй, я загружаю картинку в хранилище Firebase. Она успешно загружается.И чтобы получить URL, я использовал точный код из документации Firebase Здесь он , но он не вызывает функцию onComplete в addOnCompleteListener Вот мой код (Проблема в функции "_donClicked (View view) последняя функция) PS Этоне полный код действия

public class AddDetails extends AppCompatActivity {
DatePicker datePicker;
static int year;
static int day;
static int month;
static String UId;
static public Uri downloadurl;
Calendar calendar;
Button date_of_birth;
static public String Fname;
static public String Lname;
DatePickerDialog datePickerDialog;
int imagePickerCode=113;
StorageReference firebaseStorage;
Uri imageURI;

public void AddImage(View view)
{
    Intent intent=new Intent(Intent.ACTION_PICK, 
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(intent,imagePickerCode);
}
@Override
public void onActivityResult(int requestCode,int resultCode,Intent data)
{
        if(requestCode==imagePickerCode)
        {
            if(resultCode==RESULT_OK)
            {
                imageURI=data.getData();
                try {
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageURI);
                    ImageView imageView=(ImageView) findViewById(R.id.displayPic);
                    imageView.setImageBitmap(bitmap);
                    Button button=(Button) findViewById(R.id.addImage);
                    button.setVisibility(View.INVISIBLE);
                    imageView.setVisibility(View.VISIBLE);
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }

            }
        }
}
public void _doneClicked(View view)
{
    firebaseStorage.child("Display Pictures").child(UId).putFile(imageURI)
        .continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
        @Override
        public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
            if (!task.isSuccessful()) {
                throw task.getException();
            }
            // Continue with the task to get the download URL
            else
            return firebaseStorage.child("Display Pictures").child(UId).getDownloadUrl();
        }
    })
            .addOnCompleteListener(new OnCompleteListener<Uri>() {
        @Override
        public void onComplete(Task<Uri> task) {
            if (task.isSuccessful()) {
                downloadurl = task.getResult();
                Log.i("Done",downloadurl.toString());
            }
        }
    });
    Fname=((EditText)findViewById(R.id.firstName)).getText().toString();
    Lname=((EditText)findViewById(R.id.lastName)).getText().toString();
    setResult(RESULT_OK);
    finish();
}

}

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Итак, я нашел решение ... В основном проблема заключалась в том, что функция OnComplete переопределяется в классе addOncompleteListener, который является «слушателем», который запускается при завершении задачи.В моей функции "public void _doneClicked (View view)" действие заканчивалось до вызова функции oncomplete.Поэтому я изменил код на

   public void _doneClicked(View view)
{
    final StorageReference sss=firebaseStorage.child("Display Pictures").child(UId);
    UploadTask up=sss.putFile(imageURI);
    Task<Uri> task=up.
            continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
        @Override
        public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
            if (!task.isSuccessful()) {
                throw task.getException();
            }
            // Continue with the task to get the download URL
            else
            return sss.getDownloadUrl();
        }
    })
            .addOnCompleteListener(new OnCompleteListener<Uri>() {
        @Override
        public void onComplete(Task<Uri> task) {
            if (task.isSuccessful()) {
                downloadurl = task.getResult();
                Log.i("Done",downloadurl.toString());
                Fname=((EditText)findViewById(R.id.firstName)).getText().toString();
                Lname=((EditText)findViewById(R.id.lastName)).getText().toString();
                setResult(RESULT_OK);
                finish();
            }
        }
    });
}

PS Я новичок в Android, а также в Java, так что извините, если этот вопрос был глупым

0 голосов
/ 07 июня 2018

У меня такой же код, как и у вас, но мой по-прежнему вызывает функцию onComplete.

Я думаю, что проблема в вашем continueWithTask, в этой строке:

return firebaseStorage.child("Display Pictures").child(UId).getDownloadUrl();

Когда вы это делаете, firebaseStorage.child () создаст новый экземпляр StorageReference.И, возможно, причина этого неожиданного результата.

Попробуйте следовать примеру документации:

final StorageReference ref = firebaseStorage.child("Display Pictures").child(UId);
UploadTask uploadTask = ref.putFile(imageURI)

Task<Uri> urlTask = uploadTask
      .continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {

          @Override
          public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
              if (!task.isSuccessful()) {
                   throw task.getException();
              }

              // Continue with the task to get the download URL
              return ref.getDownloadUrl();
          }
      }).addOnCompleteListener(new OnCompleteListener<Uri>() {

          @Override
          public void onComplete(@NonNull Task<Uri> task) {
              if (task.isSuccessful()) {
                  Uri downloadUri = task.getResult();
              } else {
                  // Handle failures
                  // ...
              }
          }
     });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...