如何用截取上传大文件安卓系统)

4zcjmb1e  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(309)

我想上传一个大文件后,要求使用截击。我试图使用一个截取的multipartrequest库,但是 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() . 这似乎是个问题,因为如果一个大文件被转换成字节数组,那么它就不能放入内存。我需要成批发送请求。这怎么可能?

klh5stk1

klh5stk11#

正如@commonware在下面的评论中提到的那样,你应该放弃截击(至少现在是这样)。不久前,他们甚至想反对volley,因为它依赖于apachehttpclient,而apachehttpclient自api23以来就一直被反对,但据我所知,google仍然支持它,并打算让它更现代。
目前,请继续使用改进版和/或底层okhttp,它们利用流上传/下载,而不是满负荷存储。与那些你不会有这样的问题。

kuhbmx9i

kuhbmx9i2#

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/

bmp9r5qi

bmp9r5qi3#

读这个:截击问题
链接中写道:“它(volley)本质上要求完整的请求/响应可以存储在内存中,而对于视频上传来说,从另一个源(即磁盘)通过网络以增量方式传输这些请求/响应,以支持部分上传的恢复等,比volley的api本质上不支持的方式更有意义。”

相关问题