创建一个返回StorageReference字节的静态函数
问题描述:
我正在寻找一种方法,通过将路径传递给返回字节数据的静态函数来从我的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的实时性造成的,而是因为下载文件是异步活动。如果不是,调用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
}
});
我已经改变了这一切,而不是更新的ImageView和看起来不错。我也试过做Tasks.await(),但失败了。我不介意阻止UI线程,所以你可以提出什么建议呢? –
您可能不介意阻止UI线程,但您的用户可以。这就是为什么Android会在您检测到并显示“应用程序未响应”对话框时检测到它的原因。有关此方面的单独答案(使用实时数据库,但它同样适用于云存储),请参阅:https://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener –
I已经尝试了很多等待,信号量和倒计时,没有运气。我设法使用HTTP GET调用获取数据,但这无法帮助我使用设备缓存的Firebase数据:( 我会放弃....但应该有未来的同步操作..谢谢你的帮助弗兰克 –