2015-04-04 16 views
14

मैं आरएक्सजेवा वेधशाला का उपयोग कर रेट्रोफिट में पेजिनेशन को संभालना चाहता हूं। मैंने question से सलाह का पालन किया।रेट्रोफिट आरएक्सजेवा कॉन्सैट का उपयोग करते समय ओवरफ्लो स्टैक करें

मैं 100 से अधिक पृष्ठों दिलवाया किए जाने की जरूरत है कि है, लेकिन श्रृंखला 20 वीं पेज आसपास विफल रहता है और logcat

04-04 04:12:11.766 2951-3012/com.example.app I/dalvikvm﹕ threadid=28: stack overflow on call to Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;.compareAndSet:ZLJJ 
04-04 04:12:11.766 2951-3012/com.example.app I/dalvikvm﹕ method requires 56+20+32=108 bytes, fp is 0x94b52350 (80 left) 
04-04 04:12:11.766 2951-3012/com.example.app I/dalvikvm﹕ expanding stack end (0x94b52300 to 0x94b52000) 
04-04 04:12:11.766 2951-3012/com.example.app I/dalvikvm﹕ Shrank stack (to 0x94b52300, curFrame is 0x94b548dc) 

किसी को भी पता है क्यों इस में नीचे लॉग के साथ नमूदार जाने वाला कोई भी सदस्यता बंद हो जाता है हो सकता है?

अद्यतन: मुझे पता है कि यह रिकर्सन के कारण होता है, लेकिन क्या रेट्रोफिट और आरएक्सजेवा के साथ अंकन को संभालने का एक और अधिक शानदार तरीका है?

उत्तर

23

तो, मैंने आपके द्वारा संदर्भित मूल प्रश्न का उत्तर दिया, मुझे शायद इस मामले का उत्तर देने का प्रयास करना चाहिए। :)

यह मेरे मूल पेजिंग उत्तर के लिए एक और वैध (और संभावित रूप से सरल) विकल्प है, अब मैंने अपने शस्त्रागार में कुछ और आरएक्स चाल विकसित की हैं। :) (java8 लैम्ब्डा शैली स्यूडोकोड में हो गया):

Observable.range(Integer.MAX_VALUE) 
    // Get each page in order. 
    .concatMap(page -> getResults(page)) 
    // Take every result up to and including the one where the next page index is null. 
    .takeUntil(result -> result.next == null) 
    // Add each output to a list builder. I'm using Guava's ImmutableList, but you could 
    // just as easily use a regular ArrayList and avoid having to map afterwards. I just 
    // personally prefer outputting an immutable data structure, and using the builder 
    // is natural for this. 
    // 
    // Also, if you wanted to have the observable stream the full output at each page, 
    // you could use collect instead of reduce. Note it has a slightly different syntax. 
    .reduce(
     ImmutableList.<ResponseObject>builder(), 
     (builder, response) -> builder.addAll(response.results)) 
    // Convert list builder to one List<ResponseObject> of all the things. 
    .map(builder -> builder.build()) 
    .subscribe(results -> { /* Do something with results. */ }); 
+0

अंत में यह करने के लिए चारों ओर हो गया ... एक समान दृष्टिकोण के साथ आते हैं और यह :) – Bhuvan

+3

बहुत बढ़िया कोड काम था! मुझे लगता है कि अब 'Observable.range' की जरूरत है' int start' भी! –

+0

मान लें कि मेरे पास 1000 पेज हैं, यह व्यवहार्य/अच्छा है? – Ajinkya

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