Android 如何获取Firebase的FileDownloadTask的TotalByteCount
我正在尝试使用android应用程序中的Url获取要从Firebase存储下载的文件的总大小。问题是FileDownloadTask.getTotalByteCount()返回-1。 文件不是决定性的 它讨论了下载任务中要上传的字节数我想知道是否有人遇到此问题,以及解决此问题的方法? 下面是片段Android 如何获取Firebase的FileDownloadTask的TotalByteCount,android,firebase,firebase-storage,Android,Firebase,Firebase Storage,我正在尝试使用android应用程序中的Url获取要从Firebase存储下载的文件的总大小。问题是FileDownloadTask.getTotalByteCount()返回-1。 文件不是决定性的 它讨论了下载任务中要上传的字节数我想知道是否有人遇到此问题,以及解决此问题的方法? 下面是片段 for (DataSnapshot child : dataSnapshot.getChildren()) { String url = child.getVa
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
我试着把它放在ProgressListener中,有时返回-1,有时返回实际大小有什么解释吗?存储文件及其元数据位于Firebase服务器上。它们的值是异步加载的,当您使用
filesRef.getFile(localFile)
启动下载时,这些值不会立即可用
的文档未定义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());
}
}
});
谢谢你的解释,那部分很清楚。但在我的情况下,在onSuccessListener中获取总字节数没有意义,原因有二。1.由于这个过程已经完成,我可以直接询问本地文件的长度,2。要使进度条正常工作,它需要在onProgress中完成。我想我只需要做简单的条件和排除-1值。
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