Cómo publicar el progreso para el análisis de archivos json de gran tamaño con GSON

Estimado Stackoverflowers,

Actualmente estoy analizando un archivo json grande de mis recursos sin procesar. Tuve que cambiar la lectura línea por línea con el uso de un objeto Reader en combinación con gson, para escapar de una excepción de memoria. Hasta aquí todo bien.

Ahora todo esto sucede en una tarea asíncrona y quiero que el usuario sea notificado del progreso en algún tipo de pantalla de carga usando publishProgress() .

 InputStream raw = getResources().openRawResource(R.raw.json); Reader rd = new BufferedReader(new InputStreamReader(raw)); Gson gson = new Gson(); mReadObjects = gson.fromJson(rd, ReadObjectList.class); 

Esta es la forma en que estoy leyendo el archivo por ahora, pero no tengo idea de si (y cómo) puedo obtener cualquier tipo de actualizaciones de progreso de GSON o el objeto Reader.

¡Cualquier ayuda es muy apreciada!

Tienes que escribir un Wrapper alrededor de un InputStream (o un Reader ).

Algo como esto debería funcionar:

 public class ProgressInputStream extends FilterInputStream { private final int size; private long bytesRead; private int percent; private List<Listener> listeners = new ArrayList<>(); public ProgressInputStream(InputStream in) { super(in); try { size = available(); if (size == 0) throw new IOException(); } catch (IOException e) { throw new RuntimeException("This reader can only be used on InputStreams with a known size", e); } bytesRead = 0; percent = 0; } public void addListener(Listener listener) { listeners.add(listener); } public void removeListener(Listener listener) { listeners.remove(listener); } @Override public int read() throws IOException { int b = super.read(); updateProgress(1); return b; } @Override public int read(@NonNull byte[] b) throws IOException { return updateProgress(super.read(b)); } @Override public int read(@NonNull byte[] b, int off, int len) throws IOException { return updateProgress(super.read(b, off, len)); } @Override public long skip(long n) throws IOException { return updateProgress(super.skip(n)); } @Override public void mark(int readLimit) { throw new UnsupportedOperationException(); } @Override public void reset() throws IOException { throw new UnsupportedOperationException(); } @Override public boolean markSupported() { return false; } private <T extends Number> T updateProgress(T numBytesRead) { if (numBytesRead.longValue() > 0) { bytesRead += numBytesRead.longValue(); if (bytesRead * 100 / size > percent) { percent = (int) (bytesRead * 100 / size); for (Listener listener : listeners) { listener.onProgressChanged(percent); } } } return numBytesRead; } public interface Listener { void onProgressChanged(int percentage); } } 

Cómo utilizar:

 ProgressInputStream raw = new ProgressInputStream(getResources().openRawResource(R.raw.json)); raw.addListener(new ProgressInputStream.Listener() { @Override public void onProgressChanged(int percentage) { publishProgress(percentage); } }); Reader rd = new BufferedReader(new InputStreamReader(raw)); 
  • Reemplazar el analizador estándar de Android JSON para un mejor rendimiento?
  • Obtener correo electrónico de Facebook después de iniciar sesión en Android
  • Lectura de JSON con Retrofit
  • ¿Cómo recuperar datos de la base de datos de firebase que está teniendo matriz anidada y estructura de objetos?
  • Convertir cadena a JSON array
  • Obtener JSONObject de JSONArray
  • Iterate Json datos del servicio web en el orden correcto
  • ¿Cómo analizar la respuesta de json usando Jackson en android?
  • Img src atributo de json valor que muestra pequeña caja de color azul en Android TextView
  • Proguard problema durante el uso de GSON
  • El envío de JSON como datos adicionales en una transmisión de Android a través de ADB se formatea incorrectamente
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.