上传大型视频文件使用Retrofit(Android)有OutOfMemoryError

r12*_*597 2 upload android retrofit

对不起我的英语不好。我尝试在服务器上上传大型视频文件,此文件超过50 mb。当我上传小文件时,一切正常。在清单中,我设置了它android:largeHeap="true"android:hardwareAccelerated="false"没有帮助我。下面是我的代码:

接口

@Multipart
@POST("/api/upload")
Observable<UploadVideoResponse> uploadVideo(@Header("Authorization") String userToken,
                                            @Part MultipartBody.Part video);
Run Code Online (Sandbox Code Playgroud)

方法返回文件:

public static MultipartBody.Part getMultipartVideoBody(String pathVideo) {
    try {
        File videoFile = getFile(pathVideo);
        RequestBody videoBody = RequestBody.create(MediaType.parse("video/*"), videoFile);
        String fileName = videoFile.getName();
        return MultipartBody.Part.createFormData("video", fileName, videoBody);
    }catch (Exception e){
        Log.e("File ", e.getMessage());
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

在服务器上上传方法

new DefaultApi().uploadVideo(
                Utils.getHeaderToken(),
                Utils.getMultipartVideoBody(pathVideo)
        ).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(videoView::showLoading)
                .doOnTerminate(videoView::hideLoading)
                .subscribe(data -> {
                            videoView.setData(data);
                        }
                        , throwable -> {

                        }
                );
    }
Run Code Online (Sandbox Code Playgroud)

错误:

抛出OutOfMemoryError“未能分配100390006字节分配,其中16777216个空闲字节和92MB直到OOM”

完整的堆栈跟踪

09-11 03:53:00.571 6724-6976 / des.brain.ga E / art:抛出OutOfMemoryError“无法分配100390006字节分配,其中16777216个空闲字节和92MB直到OOM” 09-11 03:53:00.573 6724- 6976 / des.brain.ga E / AndroidRuntime:致命例外:RxIoScheduler-3进程:des.brain.ga,PID:6724 java.lang.IllegalStateException:在Scheduler.Worker线程上引发了致命异常。在rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:59)在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:422)在java.util.concurrent.FutureTask.run(FutureTask.java :237),位于java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 201(ScheduledThreadPoolExecutor.java:152),位于java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask。

记录拦截器

public final class LoggingInterceptor implements Interceptor {

    private final Interceptor mLoggingInterceptor;

    private LoggingInterceptor() {
        mLoggingInterceptor = new HttpLoggingInterceptor()
                //.setLogLevel(RestAdapter.LogLevel.FULL)
                .setLevel(BuildConfig.DEBUG ? Level.BODY : Level.NONE);
    }

    @NonNull
    public static Interceptor create() {
        return new LoggingInterceptor();
    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        return mLoggingInterceptor.intercept(chain);
    }

}
Run Code Online (Sandbox Code Playgroud)

我这样使用LoggingInterceptor

return new OkHttpClient.Builder()
                .connectTimeout(300, TimeUnit.SECONDS)
                .addInterceptor(LoggingInterceptor.create())
                .addInterceptor(logging)
                .build();
Run Code Online (Sandbox Code Playgroud)

小智 5

使用改型上载大型视频时,我也遇到了相同的错误,但是删除
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
或设置NONE 对我来说是可行的。