2012-03-23 13 views
9

मैं अपने एंड्रॉइड ऐप में एक जेसन-webservice से डेटा कैश करना चाहता हूं। पहली बार, एप्लिकेशन लॉन्च किया गया है, इसे तब तक इंतजार करना चाहिए जब तक कि सभी डेटा सेवा से लोड नहीं हो जाते। उस प्रारंभिक लोड के बाद ऐप को समय-समय पर जांच करनी चाहिए (कुछ दिन) यदि कोई नया डेटा उपलब्ध है। यदि हां, तो स्थानीय रूप से संग्रहीत डेटा को रीफ्रेश किया जाना चाहिए और अगली बार ऐप शुरू होने पर लोड किया जाना चाहिए।एंड्रॉइड पर webservice से JSON कैशिंग - पैटर्न?

वर्तमान में मैं इसे एक इंटेंट सेवा द्वारा हल करने और फ़ाइल में लोड किए गए डेटा को सहेजकर हल करने की कोशिश कर रहा हूं - लेकिन मैं एक बहुत ही सुंदर तरीका नहीं है!

क्या कोई इसे करने का एक साफ तरीका जानता है? एक कैशिंग पैटर्न?

+1

डेटाबेस में डेटा को स्टोर करने के लिए एक ContentProvider जोड़ें। यह शायद अधिक सुंदर है - यह केवल बहुत काम है जब आप आसानी से एक फाइल सहेज सकते हैं (जो कि पहले से ही एक कैशिंग पैटर्न है) – zapl

उत्तर

8

यहाँ एक बस यह है कि एक सेवा को शामिल नहीं करता करने के लिए रास्ता नहीं है, धागे, अलार्म, आदि सिर्फ एक आवरण अपने JSON, की तरह चारों ओर, परिभाषित,

class MyJson { 
    JSONObject getJson() { ... }; 
} 

getJson() के कार्यान्वयन निम्नलिखित करता है

if (cached json file exists) { 
    if (json file last modified + 1 day > current time) { 
    json = get from network; 
    cache json in file; 
    } else [ 
    json = get from file; 
    } 
} else { 
    json = get from network; 
    cache json in file; 
} 

दूसरे शब्दों में, आलसी- नेटवर्क की ताजा जेसन को नेटवर्क की आवश्यकता होने पर लाएं। अलार्म सेट करके और कैश को अपडेट करने के लिए सेवा चलाने के दौरान यह कैश फ़ाइल को समय-समय पर अद्यतन करने से काफी सरल है ...

आपके ऐप से, आप वही काम करते हैं चाहे वह डेटा का पहला भार या एनएच लोड हो। आप getJson() फोन,

new Thread(new Runnable() { 
    public void run() { 
    json = getJson(); 
    // do whatever you need to do after the json is loaded 
    } 
}).start(); 

केवल नकारात्मक पक्ष यह है कि कभी कभी, कॉल JSON प्राप्त करने के लिए अधिक समय लगेगा, और फलस्वरूप आप एक सूत्र में इसे चलाने इतनी के रूप में यूआई ANR के लिए नहीं होना चाहिए ... लेकिन आप चाहिए वैसे भी ऐसा करें, क्योंकि यह फ़ाइल में है या नेटवर्क से प्राप्त किया गया है, आपको यूआई थ्रेड में आईओ करने से बचना चाहिए।

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