2015-01-11 4 views
8

प्रिय Stackoverflowers साथ पार्स करने,कैसे GSON

मैं वर्तमान में मेरे कच्चे संसाधनों से एक बड़ी json फ़ाइल को पार्स कर रहा हूँ बड़े json फ़ाइल के लिए प्रगति प्रकाशित करने के लिए। मुझे स्मृति अपवाद से बाहर निकलने के लिए, जीसन के साथ संयोजन में रीडर ऑब्जेक्ट का उपयोग करने के लिए लाइन द्वारा रीडिंग लाइन बदलना पड़ा। अब तक सब ठीक है.

अब यह सब एक async कार्य में होता है और मैं उपयोगकर्ता 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); 

इस तरह से मैं अब के लिए फ़ाइल पढ़ रहा हूँ, लेकिन मैं कोई सुराग नहीं करता है, तो (और कैसे) मैं GSON या रीडर वस्तु से प्रगति के अपडेट के किसी भी प्रकार प्राप्त कर सकते हैं।

किसी भी मदद की बहुत सराहना कर रहा है!

उत्तर

2

आपको InputStream (या Reader) के आसपास एक रैपर लिखना है।

कुछ इस तरह काम करना चाहिए:

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

उपयोग कैसे करें:

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)); 
+0

मैं क्यों यह केवल एक वोट था और के रूप में सही रूप में चिह्नित नहीं किया गया था पता नहीं है। इससे मुझे काफी मदद मिली, इसके लिए धन्यवाद। –

 संबंधित मुद्दे