Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何获取Firebase的FileDownloadTask的TotalByteCount_Android_Firebase_Firebase Storage - Fatal编程技术网

Android 如何获取Firebase的FileDownloadTask的TotalByteCount

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

我正在尝试使用android应用程序中的Url获取要从Firebase存储下载的文件的总大小。问题是FileDownloadTask.getTotalByteCount()返回-1。 文件不是决定性的

它讨论了下载任务中要上传的字节数我想知道是否有人遇到此问题,以及解决此问题的方法?

下面是片段

 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