android - Firebase 存储的上传/下载速度非常慢

标签 android firebase firebase-storage

故事

我在我的应用中使用 Firebase 存储将大文件上传到 Firebase 存储。文件主要是视频,有时甚至超过 2 GB。

我做了什么

这就是我所做的。

UploadTask originalUpload = originalDestination.putFile(Uri.fromFile(originalSource));
            mCurrentUploadTask = originalUpload;
            originalUpload.addOnProgressListener(mOnProgressUpdateListener);
originalUpload.addOnSuccessListener(mOriginalSuccessListener);

特此通知,我还将这些同步任务转换为异步任务,因为我需要使用以下方法在后台处理所有内容,

Tasks.await(originalUpload);

问题

问题很奇怪,出乎意料。上传/下载完美,但速度很慢。

我的互联网连接速度很好,速度为 1 MBps,但这些文件从未以这种速度传输。它大约是 100-150 KBps,几乎是我网络可用速度的 15%。

在做出此声明之前,我已经在几个不同的网络上对此进行了多次测试。无论如何,我发现 Firebase 充分利用了可用带宽,而其他非 Firebase 下载/上传则全速运行。

我的应用需要下载和上传大文件,因此无法承受如此慢的传输速度。这完全出乎 Firebase 的意料。

如果我在实现过程中做错了什么或者这是 Firebase 固有的问题,请告诉我?

更新

我也一直遇到只有上传的问题。每当我下载某些东西而我只是关闭 Wifi 时,下载就会因为这个错误而被取消。

com.google.firebase.storage.StorageException: An unknown error occurred, please check the HTTP result code and inner exception for server response.

Read error: ssl=0xb7e7a510: I/O error during system call, Connection timed out
                                                                           javax.net.ssl.SSLException: Read error: ssl=0xb7e7a510: I/O error during system call, Connection timed out
                                                                               at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method)
                                                                               at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:699)
                                                                               at com.android.okio.Okio$2.read(Okio.java:113)
                                                                               at com.android.okio.RealBufferedSource.read(RealBufferedSource.java:48)
                                                                               at com.android.okhttp.internal.http.HttpConnection$FixedLengthSource.read(HttpConnection.java:446)
                                                                               at com.android.okio.RealBufferedSource$1.read(RealBufferedSource.java:168)
                                                                               at java.io.InputStream.read(InputStream.java:162)
                                                                               at com.google.firebase.storage.FileDownloadTask.run(Unknown Source)
                                                                               at com.google.firebase.storage.StorageTask$5.run(Unknown Source)
                                                                               at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                                               at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                                               at java.lang.Thread.run(Thread.java:818)

但是当我对上传执行完全相同的操作时,它只是等待连接,如果我再次打开 Wifi,它会重新连接并恢复。为什么问题只发生在下载文件时? 是不是getFile() API又出问题了?

仅供引用,我没有更改上传和下载的超时设置。它们处于默认状态。

最佳答案

我提出这个并不是要反驳你的观察,而只是作为一个比较点。作为测试,我使用下面的代码上传了一个 ~50MB 的文件并计算了进度。该测试是在带有家庭 WiFi 连接(加利福尼亚州)的三星 Galaxy S3 (4.4.2) 上运行的。平均吞吐量约为 760KB/秒。

我在使用相同网络的其他手机设备上运行了相同的测试,吞吐量范围为 300KB/秒到 850KB/秒(Moto X Pure;Marshmallow)。

private void uploadTest() {
    // This file is ~50MB
    final File file = new File("/storage/emulated/0/DCIM/Camera/20160821_101145.mp4");
    // Upload the file
    Log.i(TAG, String.format("uploadTest: Starting upload of %5.2fMB file",
            file.length()/1024.0/1024.0));

    FirebaseStorage.getInstance().getReference("test").putFile(Uri.fromFile(file))
            .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    Log.i(TAG, "onSuccess: Done");
                }
            }).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
            Log.i(TAG, String.format("onProgress: %5.2f MB transferred",
                    taskSnapshot.getBytesTransferred()/1024.0/1024.0));
        }
    });
}

这是生成的 logcat,删除了一些进度行以使列表更紧凑:

08-21 11:39:17.539 18427-18427/com.qbix.test I/MainActivity: uploadTest: Starting upload of 51.79MB file
08-21 11:39:17.559 18427-18427/com.qbix.test I/MainActivity: onProgress:  0.00 MB transferred
08-21 11:39:25.117 18427-18427/com.qbix.test I/MainActivity: onProgress:  5.00 MB transferred
08-21 11:39:31.654 18427-18427/com.qbix.test I/MainActivity: onProgress: 10.00 MB transferred
08-21 11:39:38.711 18427-18427/com.qbix.test I/MainActivity: onProgress: 15.00 MB transferred
08-21 11:39:45.088 18427-18427/com.qbix.test I/MainActivity: onProgress: 20.00 MB transferred
08-21 11:39:51.375 18427-18427/com.qbix.test I/MainActivity: onProgress: 25.00 MB transferred
08-21 11:39:57.411 18427-18427/com.qbix.test I/MainActivity: onProgress: 30.00 MB transferred
08-21 11:40:03.408 18427-18427/com.qbix.test I/MainActivity: onProgress: 35.00 MB transferred
08-21 11:40:10.886 18427-18427/com.qbix.test I/MainActivity: onProgress: 40.00 MB transferred
08-21 11:40:17.233 18427-18427/com.qbix.test I/MainActivity: onProgress: 45.00 MB transferred
08-21 11:40:23.069 18427-18427/com.qbix.test I/MainActivity: onProgress: 50.00 MB transferred
08-21 11:40:25.792 18427-18427/com.qbix.test I/MainActivity: onProgress: 51.79 MB transferred
08-21 11:40:25.792 18427-18427/com.qbix.test I/MainActivity: onSuccess: Done 

关于android - Firebase 存储的上传/下载速度非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39065607/

相关文章:

javascript - 如何将数组发布到我的 firebase 数据库中?

android - Firebase 存储在下载过程中处理网络中断

java - Google Firebase 服务器持久连接 invalid_token

firebase - 无法从 Android Studio Assistant 连接到 Firebase

firebase - 在 Firebase 存储中公开文件夹

android - Firebase Storage 生成的 URL 不允许访问该文件

java - 我的 android 应用程序中有多个 http 请求。线程

Android - 即使为应用程序禁用它也显示通知?

android - 如何使用 EditText 在 Android 中检索字符串?

java - 应用程序 :dexDebug error in Android Studio