2016-03-07 26 views
8

मैं क्या करना चाहता हूं सिर्फ अवलोकन करने के लिए एक सरल इन-मेमोरी कैश बनाना है। हालांकि मैं अटक गया क्योंकि मुझे समझ में नहीं आता कि एक अवलोकन कैसे बनाया जाए।एंड्रॉइड में एक अवलोकन योग्य कैसे बनाएं?

public class MovieCache { 
    MovieWrapper movieWrapper; 

    public Observable<MovieWrapper> getMovies() { 
     //How to create and return an Observable<MovieWrapper> here? 
    } 

    public void setCache(MovieWrapper wrapper) { 
     movieWrapper = wrapper; 
    } 

    public void clearCache() { 
     movieWrapper = null; 
    } 
} 

getMovies() विधि मैं एक नमूदार बना सकते हैं और ग्राहक के लिए अपने स्थानीय क्षेत्र movieWrapper वापस जाने के लिए चाहते हैं: यह कोड मैं अब तक मिल गया है है। मैं यह कैसे कर सकता हूँ? मैंने new Observable.just(movieWrapper) का उपयोग करने की कोशिश की लेकिन इसका परिणाम शून्य अपवाद में हुआ।

उत्तर

6

this tutorial पर एक नज़र डालें क्योंकि यह वही है जो आप खोज रहे हैं। मूल रूप से क्या आप वाकई हमेशा अपने कैश की गई वस्तु का नवीनतम संस्करण प्राप्त करने के लिए defer() का उपयोग करें:

public class MovieCache { 
    MovieWrapper movieWrapper; 

    public Observable<MovieWrapper> getMovies() { 
     return Observable.defer(new Func0<Observable<MovieWrapper>>() { 
      @Override 
      public Observable<MovieWrapper> call() { 
       return Observable.just(movieWrapper); 
      } 
     }); 
    } 

    public void setCache(MovieWrapper wrapper) { 
     movieWrapper = wrapper; 
    } 

    public void clearCache() { 
     movieWrapper = null; 
    } 
} 

defer() सुनिश्चित करें कि आप निर्माण पर नहीं Observable को सदस्यता पर वस्तु मिल जाएगा बनाता है।

नोट तथापि कि, पोस्ट के लेखक के अनुसार:

केवल नकारात्मक पक्ष को स्थगित करने() है कि यह एक नया प्रत्यक्ष प्रत्येक बार जब आप एक ग्राहक मिल बनाता है। बनाएँ() प्रत्येक ग्राहक के लिए एक ही फ़ंक्शन का उपयोग कर सकता है, इसलिए यह अधिक कुशल है। हमेशा की तरह, प्रदर्शन को मापें और आवश्यक होने पर ऑप्टिमाइज़ करें।

+1

मैंने कोशिश की यह और यह बहुत अच्छा काम करता है, बहुत बहुत धन्यवाद! –

3

जैसा कि पहले ही कहा, स्वीकार किए जाते हैं जवाब नकारात्मक

यह एक नया प्रत्यक्ष हर बार जब आप एक ग्राहक

मिल बनाता है लेकिन यह केवल एक ही नहीं है। अगर वह कहता है getMovies().subscribe(...)setCache(...) से पहले कहा जाता है

  • उपभोक्ता किसी भी मूल्य प्राप्त नहीं होगा।
  • उपभोक्ता पुन: सदस्यता चाहिए अगर वह अपडेट प्राप्त करना चाहते हैं (मान लीजिए कि setCache() कई बार कहा जा सकता हैं।
पाठ्यक्रम उन सभी को अपने परिदृश्य में अप्रासंगिक हो सकता है के

। मैं बस आपको एक और रास्ता दिखाने के लिए (चाहते हैं मुझे यकीन है कि कई और अधिक देखते हैं) हूँ। आपको इन सभी नुकसान को खत्म करने के BehaviorSubject उपयोग कर सकते हैं।

public class MovieCache { 
    private BehaviorSubject<MovieWrapper> mMovieCache = BehaviorSubject.create(); 

    public void setCache(MovieWrapper wrapper) { 
     mMovieCache.onNext(wrapper); 
    } 

    public Observable<MovieWrapper> getMovieObservable() { 
     //use this if consumer want to receive all updates 
     return mMovieCache.asObservable(); 
    } 

    public MovieWrapper getMovie() { 
     //use this if consumer want to get only current value 
     //and not interested in updates 
     return mMovieCache.getValue(); 
    } 

    public void clearCache() { 
     //CAUTION consumer should be ready to receive null value 
     mMovieCache.onNext(null); 
     //another way is to call mMovieCache.onCompleted(); 
     //in this case consumer should be ready to resubcribe 
    } 

    public static class MovieWrapper {} 

} 

BehaviorSubject marble diagram पर एक नजर डालें।

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