使用Retrofit(Android)上传大视频文件出现OutOfMemoryError

2024-01-07

对不起我的英语不好。我尝试在服务器上上传大型视频文件,该文件超过 50 MB。当我上传小文件时,一切正常。在我设置的清单中android:largeHeap="true" and 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 -> {

                        }
                );
    }

ERROR:

抛出 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.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:无法分配具有 16777216 可用字节和 92MB 的 100390006 字节分配,直到 OOM 在 java.lang.String.(String.java:332) 在 java.lang.String.(String.java:371) 在 okio.Buffer.readString(Buffer.java:620) 在 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(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) 09-11 03:53:02.159 6724-6724/des.brain.ga E/WindowManager: android.view.WindowLeaked: Activity 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.OnSubscribeLift.call(OnSubscribeLift.java:44) 在 rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) 在 rx.Observable.unsafeSubscribe(Observable.java:10256) 在 rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41) 在 rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30) 在 rx.Observable.subscribe(Observable.java:10352) 在 rx.Observable.subscribe(Observable.java:10319) 在 rx.Observable.subscribe(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) 在 android.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)

日志拦截器

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

我在使用改造上传大视频时遇到了同样的错误,但是 去除
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
或设置为NONE为我工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Retrofit(Android)上传大视频文件出现OutOfMemoryError 的相关文章

  • 使用库来维护免费/付费的应用程序版本

    维护免费 付费应用程序版本的共识似乎是使用库 并从每个活动中设置一个标志 以从代码库中获取不同的功能 这有多安全 据我了解 一个人可以root他们的手机 获取APK 并且可以对其进行反编译 即使代码被混淆 也不难看出该应用程序是带有标志的包
  • Renderscript 示例构建错误

    所以我想尝试使用 RenderScript 的示例 并在 Eclipse 中导入了 HelloWorld 但它给了我这样的错误 2011 10 25 13 10 48 HelloWorld home mileoresko workspace
  • 应用内结算错误

    我的 UNMANAGED 应用内购买无法正常工作 在它完美运行之前 我可以使用测试帐户成功购买 但它突然不起作用了 因为我记得我对商家帐户所做的只是添加更多 2 4 个测试帐户 添加后 我的应用内购买将不起作用 所以我更新了公钥并上传了一个
  • Android Studio更新到1.5后Gradle错误

    今天我已将 Android Studio 更新到 v1 5 我的 libgdx 项目在这次更新之前运行良好 现在我收到此错误消息 Error Unable to load class org gradle mvn3 org sonatype
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • 导航抽屉默认片段

    我是一名新手开发人员 我正在将导航抽屉与 android support v7 集成到我的应用程序中 我有一个问题 当我启动应用程序时 主要布局是这样的
  • 在 Jetpack Compose 中跨可组合函数重复使用一组预览注释

    在 Jetpack Compose 中迈出第一步 这非常令人惊奇 除了一个恼人的问题 我有一组固定的预览 正常 深色和 RTL Preview name Normal group Screen showBackground true Pre
  • JavaDoc 在 Android 项目中不起作用

    我在 Ubuntu 10 04 上使用 Eclipse 3 5 2 进行 Android 开发 我安装了 来自 Ubuntu 存储库的 Sun JDK Eclipse 3 5 2 经典 来自 eclipse org 解压到 opt ecli
  • Android Studio IDE 上的“文本/设计”选项卡缺少新的 Android 项目

    如何在创建新项目期间自动创建的 Activity main xml 文件的 src main res layout 文件夹中启用文本 设计选项卡 如果我右键单击并在所述文件夹上创建 xml 文件 则设计 文本选项卡存在 有什么建议吗 谢谢
  • Vimeo 视频在 Android 6 设备上停止播放

    我正在尝试在我的应用程序中播放 Vimeo 的视频 问题是在 Android 6 设备上 视频会在一定时间后停止播放 在 API 较低的设备上一切正常 时间取决于质量 对于下面提供的网址的视频 播放一定分钟 1 到 3 视频质量有多低 播放
  • Android 从命令行停止模拟器

    这个问题与如何通过命令行关闭Android模拟器 https stackoverflow com questions 5912403 how to shut down android emulator via cmd 但是 在尝试第一个答案
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • onBackPressed 隐藏 不破坏 Activity

    我知道如何取消后退按键 以便活动 主窗口保持可见 public void onBackPressed return 我的目标是隐藏该活动 但是 在没有完成它的情况下 您如何在 onBackPressed 事件中做到这一点 即我想达到 onP
  • Nexus 7 (2013) 和 Win 7 64 - 尽管检查了许多论坛和在线资源,仍无法安装 USB 驱动程序

    我正在尝试设置 Nexus 7 2013 进行调试 但我在安装 USB 驱动程序的步骤中陷入困境 到目前为止 这是我尝试过的 采取的步骤 在 Nexus 7 2013 上打开调试模式 连接设备至 PC 下载 Google USB 驱动程序于
  • NoClassDefFoundError:无法解析:Landroid/support/v7/appcompat/R$styleable

    新手尝试完成 Google 提供的我的第一个应用程序教程 在这个致命异常的过程中 我确实导入了很多随机包来消除许多事情的 无法解析 错误 例如 ActionBarActivity EditText Fragment LayoutInflat
  • android httprequest java.net.UnknownHostException

    我想用android发出http请求 是使用这个 void testHTTP HttpClient httpClient new DefaultHttpClient HttpUriRequest request new HttpPost h
  • 在 Honeycomb Android 3.0 中显示 Action Bar 菜单项的图标

    我正在使用 Honeycomb android 3 0 开发 Android 应用程序 我正在尝试在 Action Bar 中显示菜单 菜单有一个图标和标题 当我们单击菜单项时 它会以下拉列表的形式显示其项目 它是下拉列表中带有项目名称但不
  • 直接使用从密钥库加载的 SecretKey 时,密钥用户未经过身份验证

    我正在尝试使用 Cipher 和在 KeyStore 中加载的 SecretKey 来加密数据 但总是收到此错误 导致 android security KeyStoreException 关键用户未经过身份验证 我尝试自己创建 Secre
  • 在 Android 中使用 iText 将图像添加到特定位置

    我想使用 Android 中的 iText 将图像添加到 PDF 文件中的特定位置 这是一个可填写的表单 我添加了作为图像占位符的文本框 我想要做的就是像这样获取该文本框和图像 public class FormFill public st
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创

随机推荐