2017-03-22 33 views
2

okhttp3でzipファイル(サイズ160 Mb)をダウンロードしようとしています。スタックと数秒のアプリがクラッシュした後:okhttp3大容量ファイルのOutOfMemoryError

java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread. at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:59) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) at java.lang.Thread.run(Thread.java:761) Caused by: java.lang.OutOfMemoryError: Failed to allocate a 8204 byte allocation with 1688 free bytes and 1688B until OOM at okio.Segment.(Segment.java:61) at okio.SegmentPool.take(SegmentPool.java:46) at okio.Buffer.writableSegment(Buffer.java:1151) at okio.Okio$2.read(Okio.java:136) at okio.AsyncTimeout$2.read(AsyncTimeout.java:238) at okio.RealBufferedSource.read(RealBufferedSource.java:45) at okhttp3.internal.http.Http1xStream$FixedLengthSource.read(Http1xStream.java:377) at okio.RealBufferedSource.request(RealBufferedSource.java:66) at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:238) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:170) at okhttp3.RealCall.execute(RealCall.java:60) at com.bvs.data.MapService$2.call(MapService.java:102) at com.bvs.data.MapService$2.call(MapService.java:94) at rx.Observable.unsafeSubscribe(Observable.java:10142)

ここに私のコードです:

Observable.create((Observable.OnSubscribe<ResponseBody>) subscriber -> { 
     Timber.e("Start zip loading"); 
     Request request = new Request.Builder() 
       .url(Tweakables.DEV_API_ENDPOINT + "files/" + Tweakables.MAP_ZIP) 
       .build(); 
     try { 
      Response response = client.newCall(request).execute(); // Crash appeared at this line 
      subscriber.onNext(response.body()); 
      response.close(); 
     } catch (IOException e) { 
      subscriber.onError(e); 
     } 
    }) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Observer<ResponseBody>() { 
       @Override 
       public void onCompleted() { 

       } 

       @Override 
       public void onError(Throwable e) { 
        e.printStackTrace(); 
       } 

       @Override 
       public void onNext(ResponseBody responseBody) { 

       } 
      }); 
+1

のzipのような大きなファイルをダウンロードするには、ダウンロードマネージャを使用してくださいを使用して問題を解決しました。 – HourGlass

+1

'HttpLoggingInterceptor'がレスポンスボディを記録しようとし、その内容をメモリにロードしようとしている可能性があります。 – miensol

+0

@miensol 'HttpLoggingInterceptor.Level.NONE'と同じエラーを設定しようとしました – Drake

答えて

2

はたぶん誰かのために参考になります。 Retrofit注釈Streaming

@Streaming 
@GET("files/"+Tweakables.MAP_ZIP) 
Call<ResponseBody> downloadMap(); 
関連する問題