0

在此处输入图像描述

在此处输入图像描述

addInterceptor ->HttpLoggingInterceptor bug-->OOM

4

2 回答 2

0
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        //设置缓存路径
        File httpCacheDirectory = new File(MyApplication.mContext.getCacheDir(), "responses");
        //设置缓存 10M
        Cache cache = new Cache(httpCacheDirectory, 10 * 1024 * 1024);
        OkHttpClient client = null;

        final TrustManager[] trustManager = new TrustManager[]{
                new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {

                    }

                    @Override
                    public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {

                    }

                    @Override
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return new java.security.cert.X509Certificate[0];
                    }
                }
        };
        try {
            SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustManager, new SecureRandom());
            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
            client = new OkHttpClient.Builder().addInterceptor(interceptor).sslSocketFactory(sslSocketFactory).addInterceptor(new BaseInterceptor()).hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            }).cache(cache).build();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        }
        _instance = new Retrofit.Builder().baseUrl(ConstantUtils.HOST)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create()).client(client).build();
    }
    return _instance.create(ICommonService.class);

         RetrofitUtils.generateCommonService().down().subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<ResponseBody>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {
                    LogUtils.e("errorrrrrrrrrr");

                }

                @Override
                public void onNext(ResponseBody responseBody) {
                    BufferedOutputStream bos = null;
                    FileOutputStream fos = null;
                    try {
                        byte[] by = responseBody.bytes();
                        File file = new File(BaseApplication.getContext().getFilesDir(), "download.apk");
                        fos = new FileOutputStream(file);
                        bos = new BufferedOutputStream(fos);
                        bos.write(by);
                        LogUtils.e("length=======>",file.length()+"");
                        mainView.updateApk(file);
                    }catch (IOException e){
                        e.printStackTrace();
                    }finally {
                        if (bos != null)
                        {
                            try
                            {
                                bos.close();
                            }
                            catch (IOException e)
                            {
                                e.printStackTrace();
                            }
                        }
                        if (fos != null)
                        {
                            try
                            {
                                fos.close();
                            }
                            catch (IOException e)
                            {
                                e.printStackTrace();
                            }
                        }
                    }
                    LogUtils.e("success=========");
                }
            });
于 2016-03-31T08:27:17.650 回答
0

当您使用 HttpLoggingInterceptor.Level.BODY 时,您尝试下载大文件,会将所有正文保存在内存中以进行日志记录。

这很容易让 OOM 。

尝试删除日志正文或仅记录 NONE 、 basic 或 header ,然后重试。

        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        //设置缓存路径

尝试这个 。

        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.NONE);
        //设置缓存路径        
于 2020-02-07T09:24:20.763 回答