Fuera de memoria usando Retrofit 2 para descargar un archivo
Tengo una aplicación de visor de pdf donde tengo que descargar archivos pdf grandes (136 MB por ejemplo) Estoy utilizando retrofit2-beta2 para este proceso. El problema es que siempre me quedo sin memoria. ¿Cómo puedo decir retrofit que voy a descargar un archivo grande, por favor, sólo dar el byteStream para mí?
Mi interfaz es:
- ¿Cómo puedo un punto de coordenadas por radio con otro punto de coordenadas y distancia en Km?
- Decodificar áreas específicas de la imagen en Bitmapfactory?
- Android imageview.setBackgroundResource () no funciona
- ¿Por qué no aparece la fecha de lanzamiento de Android?
- Referencia de valores de una matriz en java
@GET("url") Call<ResponseBody> getData(params);
Tengo una clase de ProgressResponseBody que está ampliando el ResponseBody y estoy fijando un progressListener aquí, poder refrescar mi progressbar,
Y en la función onResponse
recibo el InputStream como
InputStream input = response.body().byteStream(); FileOutputStream out = new FileOutputStream(file); int bufferSize=1024; byte[] buffer = new byte[bufferSize]; int len = 0; while (len = input.read(buffer) != -1) { out.write(buffer,0,len); } if(out!=null) out.close();
ACTUALIZAR
He añadido el @Stream a la interfaz pero ahora tengo NetworkOnMainThreadException en el ProgressResponseBody.java El error se lanza en el super.read (sink, byteCount); fila. ¿Cómo podría poner esto a un hilo separado?
@Override public BufferedSource source() throws IOException { if (bufferedSource == null) { bufferedSource = Okio.buffer(source(responseBody.source())); } return bufferedSource; } private Source source(Source source) { return new ForwardingSource(source) { long totalBytesRead = 0L; @Override public long read(Buffer sink, long byteCount) throws IOException { long bytesRead = super.read(sink, byteCount); totalBytesRead += bytesRead != -1 ? bytesRead : 0; progressListener.update(totalBytesRead, responseBody.contentLength(), bytesRead == -1); return bytesRead; } }; }
- Tools.jar parece no estar en el classpath de Android Studio en Windows 8
- ¿Cómo puedo tener un ListView dentro de un NestedScrollView
- Actualizar widget a la medianoche (12 AM) falla
- El nombre del paquete de refactorización rompe toda la aplicación
- ¿Usando la cadena del recurso XML en el interruptor?
- Android - Determinar el límite de texto SMS
- Cadenas en android / java, replace () no hace nada
- Roto, gota, sombra, flotante, acción, botón, pre, lollipop
Agregue la anotación @Streaming
a su llamada para recuperar el ResponseBody
procesar.
@Streaming @GET("url") Call<ResponseBody> getData(params);
- ¿Cómo guardar una imagen en almacenamiento interno y luego mostrarla en otra actividad?
- ¿Es esta una forma válida de mantener una referencia estática y Actividad / Contexto? ¿Por qué no debo hacer esto?