Загрузите большой видеофайл, используя Retrofit (Android), OutOfMemoryError - PullRequest
0 голосов
/ 11 сентября 2018

Извините за мой английский. Я пытаюсь загрузить большой видеофайл на сервер, этот файл более 50 мб. Когда я загружаю небольшие файлы, все работает отлично. В манифесте я установил android:largeHeap="true" и android:hardwareAccelerated="false", это мне не поможет. Ниже мой код:

Интерфейс

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

файл возврата метода:

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;
    }
}

метод загрузки на сервер

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 -> {

                        }
                );
    }

ОШИБКА:

Throwing OutOfMemoryError "Не удалось выделить 100390006 байт распределение с 16777216 свободных байтов и 92 МБ до OOM "

ПОЛНАЯ трассировка стека

09-11 03: 53: 00.571 6724-6976 / des.brain.ga E / art: Метание OutOfMemoryError "Не удалось выделить 100390006 байт для 16777216 свободных байтов и 92 МБ до 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.run (ScheduledThreadPoolExecutor.java:265) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1112) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:587) на java.lang.Thread.run (Thread.java:818) Причина: java.lang.OutOfMemoryError: Не удалось выделить 100390006 байт с 16777216 свободных байтов и 92 МБ до OOM at java.lang.String. (String.java:332) на java.lang.String. (String.java:371) at okio.Buffer.readString (Buffer.java:620) at okio.Buffer.readString (Buffer.java:603) на okhttp3.logging.HttpLoggingInterceptor.intercept (HttpLoggingInterceptor.java:199) в des.brain.ga.api.base.LoggingInterceptor.intercept (LoggingInterceptor.java:31) в okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:147) в okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121) в okhttp3.RealCall.getResponseWithInterceptorChain (RealCall.java:200) на okhttp3.RealCall.execute (RealCall.java:77) в retrofit2.OkHttpCall.execute (OkHttpCall.java:180) в retrofit2.adapter.rxjava.CallExecuteOnSubscribe.call (CallExecuteOnSubscribe.java:40) в retrofit2.adapter.rxjava.CallExecuteOnSubscribe.call (CallExecuteOnSubscribe.java:24) на retrofit2.adapter.rxjava.BodyOnSubscribe.call (BodyOnSubscribe.java:36) на retrofit2.adapter.rxjava.BodyOnSubscribe.call (BodyOnSubscribe.java:28) на rx.Observable.unsafeSubscribe (Observable.java:10256) в rx.internal.operators.OnSubscribeMap.call (OnSubscribeMap.java:48) в rx.internal.operators.OnSubscribeMap.call (OnSubscribeMap.java:33) в rx.internal.operators.OnSubscribeLift.call (OnSubscribeLift.java:48) в rx.internal.operators.OnSubscribeLift.call (OnSubscribeLift.java:30) на rx.Observable.unsafeSubscribe (Observable.java:10256) в rx.internal.operators.OperatorSubscribeOn $ SubscribeOnSubscriber.call (OperatorSubscribeOn.java:100) в rx.internal.schedulers.CachedThreadScheduler $ EventLoopWorker $ 1.call (CachedThreadScheduler.java:230) в rx.internal.schedulers.ScheduledAction.run (ScheduledAction.java:55) в 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.run (ScheduledThread.orkeqThreadPoolExecutor.java:1112) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:587) в java.lang.Thread.run (Thread.java:818) 09-11 03: 53: 02.159 6724-6724 / des.brain.ga E / WindowManager: android.view.WindowLeaked: действие des.brain.ga.ui.main.HomeActivity утекло окно com.android.internal.policy.impl.PhoneWindow $ DecorView {2ccb16a1 V.ED.... R ..... ID 0,0-144,144}, который был первоначально добавлен здесь на android.view.ViewRootImpl. (ViewRootImpl.java:363) на android.view.WindowManagerGlobal.addView (WindowManagerGlobal.java:261) на android.view.WindowManagerImpl.addView (WindowManagerImpl.java:69) на android.app.Dialog.show (Dialog.java:298) на com.kaopiz.kprogresshud.KProgressHUD.show (KProgressHUD.java:233) в des.brain.ga.ui.video.UploadVideoFragment.showLoading (UploadVideoFragment.java:150) в des.brain.ga.ui.video.VideoPresenter $$ Lambda $ 4.call (неизвестный источник) вrx.internal.operators.OperatorDoOnSubscribe.call (OperatorDoOnSubscribe.java:40) в rx.internal.operators.OperatorDoOnSubscribe.call (OperatorDoOnSubscribe.java:27) в rx.internal.operators.OnSubscribeLub.Clubв rx.internal.operators.OnSubscribeLift.call (OnSubscribeLift.java:30) в rx.Observable.unsafeSubscribe (Observable.java:10256) в rx.internal.operators.OnSubscribeDoOnEach.call (OnSubscribeDoOnEach.java) at.internal.operators.OnSubscribeDoOnEach.call (OnSubscribeDoOnEach.java:30) в rx.Observable.subscribe (Observable.java:10352) в rx.Observable.subscribe (Observable.java:10319) в rx.Observable.subscribe (Observable.java (Observable.java).: 10159) на des.brain.ga.ui.video.VideoPresenter.uploadVideo (VideoPresenter.java:65) на des.brain.ga.ui.video.UploadVideoFragment.lambda $ uploadVideo $ 0 $ UploadVideoFragment (UploadVideoFragment.java:127) в des.brain.ga.ui.video.UploadVideoFragment $$ Lambda $ 0.onClick (неизвестный источник) в com.afollestad.materialdialogs.MaterialDialog.onClick (MaterialDialog.java:410) в андроиде.view.View.performClick (View.java:4756) на android.view.View $ PerformClick.run (View.java:19749) на android.os.Handler.handleCallback (Handler.java:739) на android.os.Handler.dispatchMessage (Handler.java:95) на android.os.Looper.loop (Looper.java:135) на android.app.ActivityThread.main (ActivityThread.java:5221) на java.lang.reflect.Method.invoke (Собственный метод) в java.lang.reflect.Method.invoke (Method.java:372) в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:899) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:694)

LoggingInterceptor

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);
    }

}

и я использую LoggingInterceptor, например:

return new OkHttpClient.Builder()
                .connectTimeout(300, TimeUnit.SECONDS)
                .addInterceptor(LoggingInterceptor.create())
                .addInterceptor(logging)
                .build();

1 Ответ

0 голосов
/ 26 декабря 2018

Я столкнулся с той же ошибкой при загрузке большого видео с помощью модернизации, но Удаление
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
или установить как NONE работал на меня.

...