2017-10-21 5 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]; 
} 

はもちろん、これはFirebaseがリアルタイムサービスであるが、私はいくつかの回避策がにあると確信しているので、(すべてのリターンがnull)期待通りに動作しませんでした:私は、ビットマップを取得するには、このような何かを試してみました私が探しているものを達成する。私は簡単で簡単なものが必要です。

答えて

0

これはFirebaseのリアルタイム性によってはそれほど多くはありませんが、ファイルをダウンロードすることは非同期的な動作であるという事実が原因です。そうでない場合は、getBitmapFromStringPathを呼び出すと、ユーザーはあなたのアプリとやりとりできなくなり、Androidは「アプリケーションが応答していません」というダイアログを表示します。どちらか

  • getBitmapFromStringPathに、または getBitmapFromStringPathTask私たちを返すバイト を必要とするコードを移動:ここ

    ソリューションにあります。

    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 
         } 
        }); 
    } 
    

    これはあなたのような、追加の情報を渡すことが必要な場合があります:

非同期動作に対処する最も簡単な方法は、に成功リスナーをバイトを必要とするコードを移動することですビットマップを設定することを表示します。

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を呼び出すコードに成功リスナーを持っているし、タスクを返すと考える

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

私が代わりにImageViewのを更新することを変更しましたし、いいね。私もTasks.await()を実行しようとしましたが失敗しました。私はUIスレッドを全くブロックしても構わないので、何をお勧めしますか? –

+0

あなたはUIスレッドをブロックしても構いませんが、ユーザーはこれを気にする必要はありません。あなたがそうしたときにアンドロイドがそれを検出し、「アプリケーションが応答していません」というダイアログが表示されます。これに関する別の回答(リアルタイムデータベースを使用し、Cloud Storageにも等しく適用されます)については、https://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listenerを参照してください。 –

+0

I待っているセマフォの多くを試してみました。私はHTTP GETコールを使用してデータを取得することができましたが、それはデバイス上にキャッシュされたFirebaseデータを手伝ってくれません:( 私は降伏させていただきます...しかし、フランクを助ける –

関連する問題