2017-03-24 2 views
0

나는 firebase 기억 장치에 이미지를 업로드하고 url을 반환하는 기능이 있습니다 (활동 내부에는 없음). 내 문제는 UploadTask이 끝날 때까지 기다려야합니다. 그렇지 않으면 null 문자열이 반환됩니다. .청취자를위한 Firebase 저장 대기

public String pushRegisterImage(Bitmap image) { 
    StorageReference imagesRef = storage.getReferenceFromUrl(STORAGE_REF) 
      .child(FINDMYPET).child(IMAGES).child(String.valueOf(UUID.randomUUID())); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    image.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
    byte[] data = baos.toByteArray(); 
    UploadTask uploadTask = imagesRef.putBytes(data); 

    uploadTask.addOnFailureListener(new OnFailureListener() { 
     @Override 
     public void onFailure(@NonNull Exception e) { 
      imageUrl = null; 
      Log.e(LOG_TAG, "Image upload error: " + e); 
     } 
    }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 
     @Override 
     public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
      imageUrl = taskSnapshot.getDownloadUrl().toString(); 
      Log.v(LOG_TAG, "Image uploade sucess, url: " + imageUrl); 
     } 
    }); 
    return imageUrl; 
} 

답변

0

당신은 기적 중포 기지에 데이터를 입력 (그리고 결과를 기다리십시오)하려고하지만, 안드로이드 SDK에서 제공 중포 기지 데이터베이스와의 모든 상호 작용은 그렇지 "동기"일에 잘 어울리는 실시간 데이터베이스입니다 (비동기) 그래서 당신의 반환 문제에 대한 해결책은 없습니다.

질문에 대한 답변은 코드를 다시 생각해보고 Firebase에 대한 모든 내용이 비동기이라는 것을 기억하십시오.

+0

괜찮습니다. 감사합니다. –

0

com.google.android.gms.tasks.Tasks.await(uploadTask);을 여기에 언급 된대로 사용하십시오 : Firebase Storage upload synchronously. 이건 내 문제가 해결되었습니다 (더 많은 파일을 업로드해야했습니다 다른 하나는입니다). 또한, 이것은 UIThread에서 실행되도록 의도 된 것이 아니므로 비동기 작업 또는 유사한 것을 만드십시오.

final UploadTask uploadTask 
      =FirebaseStorage.getInstance().getReference("...").putFile(path); 
try { 
    com.google.android.gms.tasks.Tasks.await(uploadTask); 
} catch (ExecutionException e) { 
    e.printStackTrace(); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
Log.d("Upload", "upload took " + (System.currentTimeMillis() - start));