故事
我在我的应用程序中使用 Firebase 存储来上传大文件到 Firebase 存储。这些文件大多是视频,有时甚至可以超过 2GB。
我的做法
以下是我所做的事情。
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再次出问题了吗?
值得注意的是,我没有更改上传和下载的超时设置。它们都保持默认设置。