java - 如何使用 Volley 上传大文件?( 安卓 )
问题描述
我想使用 Volley 在 POST 请求中上传大文件。我尝试使用VolleyMultiPartRequest库,但我得到java.lang.OutOfMemoryError
:
2020-11-13 19:14:06.636 18802-18802/com.example.myproject E/MainActivity: Tried to start foreground service from background
2020-11-13 19:14:09.730 18802-19082/com.example.myproject E/AndroidRuntime: FATAL EXCEPTION: Thread-15
Process: com.example.myproject, PID: 18802
java.lang.OutOfMemoryError: Failed to allocate a 303955984 byte allocation with 8388608 free bytes and 108MB until OOM, max allowed footprint 162626224, growth limit 268435456
at java.util.Arrays.copyOf(Arrays.java:3164)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
at com.example.myproject.utils.VolleyMultiPartRequest2.getBody(VolleyMultiPartRequest2.java:109)
at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:275)
at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:249)
at com.android.volley.toolbox.HurlStack.executeRequest(HurlStack.java:94)
at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:123)
at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:131)
at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:111)
at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:90)
VolleyPlus MultiPartRequest等所有库都覆盖了该函数public byte[] getBody()
。这似乎是问题所在,因为如果将大文件转换为字节数组,那么它就无法放入内存中。我需要分块发送请求。这怎么可能?
解决方案
Volley 在大文件上传方面存在一些已知问题。
对大文件使用分段文件上传,例如(通过改造):
public interface FileUploadService {
@Multipart
@POST("/upload")
void upload(@Part("myfile") TypedFile file,
@Part("description") String description,
Callback<String> cb);
}
供您参考:https ://futurestud.io/blog/retrofit-how-to-upload-files/
推荐阅读
- php - 调用未定义函数 form_close()
- react-native - 如何使用离子反应进行 OTP 身份验证?
- linux - 为什么 mmap 仍然增加磁盘读取?
- docker - Alertmnager:集群监听地址和广告地址的区别
- c++ - C++ 从 Visual Studio 项目中的所有文件中运行一个 cpp 文件
- c++ - 从用户获取链接列表的值,直到用户按 0,然后在 C++ 中显示输出
- r - 在 Seperate_rows 函数中将负值转换为正值
- c# - 使用 C# WPF 添加数据
- android - Android 图像视图未更新
- flutter - 如何避免动画列表Flutter内的圆形头像卡顿?