- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Android 应用程序中的 Url 获取要从 Firebase 存储下载的文件的总大小。问题是 FileDownloadTask.getTotalByteCount() 返回 -1。该文档不是决定性的。 https://firebase.google.com/docs/reference/android/com/google/firebase/storage/FileDownloadTask.TaskSnapshot.html#getTotalByteCount()
它讨论了在下载任务中要上传的字节。 我想知道是否有人遇到过这个问题以及解决问题的方法?
这是 fragment
for (DataSnapshot child : dataSnapshot.getChildren()) {
String url = child.getValue().toString();
StorageReference filesRef = FirebaseStorage.
getInstance().
getReferenceFromUrl(url);
if (filesRef == null) continue;
final String fileName = filesRef.getName();
final String[] path = filesRef.getPath().split("/");
final String folder = path[path.length - 2];
File dir = new File(
context.
getFilesDir().
getPath() +
File.separator + folder);
if (!dir.exists()) dir.mkdir();
final File localFile = new File(dir, fileName);
FileDownloadTask task = filesRef.getFile(localFile);
task.getSnapshot().getTotalByteCount();
Log.i("ccss", "totalByteCount :: " +
task.getSnapshot().getTotalByteCount());
输出
I/ccss: totalByteCount :: -1
I/ccss: totalByteCount :: -1
I/ccss: totalByteCount :: -1
I/ccss: totalByteCount :: -1
我试着把它放在 onProgressListener 中,有时它返回 -1,有时返回实际大小。 有什么解释吗?
最佳答案
存储文件及其元数据位于 Firebase 服务器上。它们的值是异步加载的,并且在您使用 filesRef.getFile(localFile)
启动下载时不会立即可用。
FileDownloadTask.TaskSnapshot 的文档没有定义 getTotalByteCount()
的值何时生效。鉴于它必须从服务器获取,可以假设它在下载开始时不有效,并且在下载成功完成之前可能无效。
下面的代码在下载的不同点对 getTotalByteCount()
的值进行采样。它证实了您的观察,即当下载开始时以及 onProgress()
的前几次调用中 getTotalByteCount()
为 -1。然后它在随后的 onProgress()
调用中变得有效,并在调用 onComplete()
时保持有效。
要可靠地获取总字节数,请使用 OnCompleteListener
或 OnSuccessListener
并从回调中返回的 FileDownloadTask.TaskSnapshot
获取计数.
FileDownloadTask task = filesRef.getFile(localFile);
FileDownloadTask.TaskSnapshot snap = task.getSnapshot();
Log.d(TAG, String.format("atStart: bytes=%d total=%d",
snap.getBytesTransferred(), snap.getTotalByteCount()));
task.addOnProgressListener(new OnProgressListener<FileDownloadTask.TaskSnapshot>() {
@Override
public void onProgress(FileDownloadTask.TaskSnapshot snap) {
Log.d(TAG, String.format("onProgress: bytes=%d total=%d",
snap.getBytesTransferred(), snap.getTotalByteCount()));
}
}).addOnCompleteListener(new OnCompleteListener<FileDownloadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<FileDownloadTask.TaskSnapshot> task) {
long total = task.getResult().getTotalByteCount();
long trans = task.getResult().getBytesTransferred();
Log.d(TAG, String.format("onComplete: bytes=%d total=%d", trans, total));
if (task.isSuccessful()) {
Log.d(TAG, "onComplete: SUCC");
} else {
Log.d(TAG, "onComplete: FAIL " + task.getException().getMessage());
}
}
});
示例输出:
atStart: bytes=0 total=-1
onProgress: bytes=0 total=-1
onProgress: bytes=0 total=-1
onProgress: bytes=262144 total=2814800
onProgress: bytes=524288 total=2814800
onProgress: bytes=786432 total=2814800
onProgress: bytes=1048576 total=2814800
onProgress: bytes=1310720 total=2814800
onProgress: bytes=1572864 total=2814800
onProgress: bytes=1835008 total=2814800
onProgress: bytes=2097152 total=2814800
onProgress: bytes=2359296 total=2814800
onProgress: bytes=2621440 total=2814800
onProgress: bytes=2814800 total=2814800
onComplete: bytes=2814800 total=2814800
onComplete: SUCC
关于android - 如何为 Firebase 的 FileDownloadTask 获取总字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45245225/
我是一名优秀的程序员,十分优秀!