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

当然不如预期(所有收益都为空),因为火力地堡是一个实时的服务,但我敢肯定,有一些解决方法,此不工作实现我正在寻找的东西。我需要简单而简单的事情。

回答

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

我已经改变了这一切,而不是更新的ImageView和看起来不错。我也试过做Tasks.await(),但失败了。我不介意阻止UI线程,所以你可以提出什么建议呢? –

+0

您可能不介意阻止UI线程,但您的用户可以。这就是为什么Android会在您检测到并显示“应用程序未响应”对话框时检测到它的原因。有关此方面的单独答案(使用实时数据库,但它同样适用于云存储),请参阅:https://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener –

+0

I已经尝试了很多等待,信号量和倒计时,没有运气。我设法使用HTTP GET调用获取数据,但这无法帮助我使用设备缓存的Firebase数据:( 我会放弃....但应该有未来的同步操作..谢谢你的帮助弗兰克 –

相关问题