请看下面的代码,这是我用来上传视频到服务器的。然而,对于足够大的视频,我会遇到OutOfMemory异常。
InputStream stream = getContentResolver().openInputStream(videoUri);
byte[] byteArray = IOUtils.toByteArray(stream);
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", "fname",
RequestBody.create(MediaType.parse("video/mp4"), byteArray))
.build();
Request request = new Request.Builder()
.url(uploadURL)
.post(requestBody)
.build();
OkHttpClient client = new OkHttpClient.Builder().build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
请问有没有人可以指导一下如何避免OutOfMemory异常?我能否从InputStream转化为requestBody?
RequestBody.writeTo()
时,都打开一个InputStream
,就像这个例子所做的那样。如果你在writeTo()
外面打开InputStream
,它将在第一次读取整个数据后不再具备数据。2.AssetFileDescriptor
在响应完成之前会一直被使用(必须关闭,否则会导致资源泄漏)。你也可以 不 使用AssetFileDescriptor
,而是在writeTo
中获取长度(可能使用ContentResolver.query()
),并使用和关闭ContentResolver.openInputStream()
。 - ephemient