2017-10-21 1 views
-1

바이트를 반환하는 정적 함수에 경로를 전달하여 FirebaseStorage에서 파일을 다운로드 할 수있는 방법을 찾고 있습니다.StorageReference 바이트를 반환하는 정적 함수 만들기

public static Bitmap getBitmapFromStringPath(String path) 
{ 
    final Bitmap[] bitmap = new Bitmap[1]; 
    StorageReference storage = FirebaseStorage.getInstance().getReference(path); 
    storage.getBytes(1024 * 1024).addOnSuccessListener(new OnSuccessListener<byte[]>() { 
     @Override 
     public void onSuccess(byte[] bytes) { 
      bitmap[0] = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
     } 
    }); 
    return bitmap[0]; 
} 

은 물론이 중포 기지는 실시간 서비스입니다하지만 몇 가지 해결 방법에있다 확신하기 때문에 (모든 반환 null이) 예상대로 작동하지 않았다 : 나는 비트 맵을 얻기 위해 이런 식으로 뭔가를 시도했다 내가 원하는 것을 성취해라. 나는 간단하고 쉬운 것을 필요로한다.

답변

0

이것은 Firebase의 실시간 특성 때문에 발생하지는 않지만, 파일 다운로드가 비동기 작업이라는 사실에 기인합니다. 그렇지 않은 경우 getBitmapFromStringPath으로 전화하면 사용자가 앱과 상호 작용하지 못하며 Android는 '애플리케이션 응답 없음'대화 상자를 표시합니다.

  • 하나가getBitmapFromStringPath
  • 으로 바이트 을 필요로하는 코드를 이동하거나 Task 우리 getBitmapFromStringPath의를 반환 : 여기

    이 솔루션이다.

    public static void getBitmapFromStringPath(String path) 
    { 
        final Bitmap[] bitmap = new Bitmap[1]; 
        StorageReference storage = FirebaseStorage.getInstance().getReference(path); 
        storage.getBytes(1024 * 1024).addOnSuccessListener(new OnSuccessListener<byte[]>() { 
         @Override 
         public void onSuccess(byte[] bytes) { 
          bitmap[0] = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
          // TODO: Do what you need with bitmap 
         } 
        }); 
    } 
    

    이것은 당신이 등과 같은 추가 정보를 전달해야 할 수도 있습니다 :

비동기 행동 문제를 해결하는 가장 간단한 방법은에 성공 리스너를 바이트 을 필요로하는 코드를 이동하는 것입니다 비트 맵을 설정하려는보기.

대안이 작업을 반환 고려하고 getBitmapFromStringPath 호출하는 코드에 성공 리스너가 : 다음

public static Task<byte[]> getBitmapFromStringPath(String path) 
{ 
    final Bitmap[] bitmap = new Bitmap[1]; 
    StorageReference storage = FirebaseStorage.getInstance().getReference(path); 
    return storage.getBytes(1024 * 1024) 
} 

과 :

getBitmapFromStringPath("...").addOnSuccessListener(new OnSuccessListener<byte[]>() { 
    @Override 
    public void onSuccess(byte[] bytes) { 
     bitmap[0] = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
     // TODO: Do what you need with bitmap 
    } 
}); 
+0

내가 그 대신에 이미지 뷰를 업데이트 변경했습니다과 좋아 보인다. 나는 Tasks.await()도하려고했지만 실패했다. 나는 UI 스레드를 전혀 차단하지 않으므로 그것에 대해 무엇을 제안 할 수 있습니까? –

+0

UI 스레드를 차단하는 데 신경 쓰지 않아도되지만 사용자는이를 수행 할 수 있습니다. 그래서 안드로이드가 그렇게 할 때 안드로이드가이를 감지하고 "응답 없음"대화 상자를 보여줍니다. 이에 대한 별도의 답변은 Realtime Database를 사용하지만 Cloud Storage에도 동일하게 적용됩니다. https://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener –

+0

I 기다리는 세마포어를 많이 시험해보고 행운을 빕니다. HTTP GET 호출을 사용하여 데이터를 가져올 수는 있지만 Firebase 데이터가 캐쉬 된 장치에서 나를 도와주지는 않습니다. ( 항복 하겠지만 .... 향후 동기 작업이 있어야합니다. 감사합니다. 프랑크 원조 –

관련 문제