2017-04-21 10 views
11

मैं एमवीपी आर्किटेक्चर के बाद परियोजना विकसित कर रहा हूं। आमतौर पर, जब मैं रीसाइक्लर व्यू का उपयोग करता हूं, तो मेरा प्रस्तुतकर्ता एडाप्टर डेटा नियंत्रित करता है। लेकिन अब मुझे कैश (या कैश की तरह कुछ) के साथ रीसाइक्लिंग एडाप्टर बनाने की जरूरत है, रीसाइक्लिंग का आकार कैश आकार पर निर्भर नहीं है, इसलिए मैं हैश मैप के माध्यम से कैश बना देता हूं, जहां कुंजी है - रीसाइक्लिंग की स्थिति, यदि कोई आइटम है नक्शा तब डेटा दिखाता है, अन्य चीज़ों के साथ खाली पंक्ति "घटनाओं को जोड़ें" बीटीएन। और मुझे एहसास नहीं हो सकता कि इस तरह के ढांचे में उस कैश के लिए जगह - मॉडल (दाओ या कैशमेनर की तरह कुछ) या एडाप्टर में।एमवीपी एडाप्टर डेटा कैश

कैश विचार निम्न है: मेरे पास कुछ प्रकार की घटनाएं हैं जो डेटाबेस में संग्रहीत होती हैं, प्रत्येक घटना डीबी में इसे संशोधित करने में संशोधित करती है - इसलिए कैश को भी अपडेट किया जाना चाहिए।

मुख्य प्रश्न हैं: इस कैश को कहां रखना है और इसे एडाप्टर में लोड करना है, मैं इसे डेटाबेस परिवर्तनों के साथ कैसे सिंक कर सकता हूं।

पीएस इसके अलावा मैं आरएक्स का उपयोग करने की कोशिश करता हूं, इसलिए यदि इसे हल किया जा सकता है - तो कोशिश करना बहुत दिलचस्प होगा।

पी.पी.एस. अगर यह रिपोजिटरी पैटर्न हल करने का तरीका है - स्वागत है। कुछ समय पहले इसके बारे में पढ़ें।

उत्तर

3

आपकी समस्या नहीं लग रहा है जैसे कि यह RecyclerView.Adapter से संबंधित है - और वास्तव में आप अपने Adapter भीतर इसे हल करने की कोशिश नहीं करनी चाहिए: या "एडाप्टर" एडाप्टर की जिम्मेदारी (एक सेतु के रूप में कार्य करने के लिए है ;-)) अपने डेटा के बीच और घटक देखें। इसे और ज़िम्मेदारी देने से यह उस चीज़ में बदल जाएगा जो अन्य Adapter कार्यान्वयन के साथ अंतर-परिवर्तनीय नहीं है (आपको यह नहीं चाहिए!)।

आपको शायद अपने डेटा दृढ़ता को सारणीबद्ध करने का एक साफ तरीका मिलना चाहिए। इन-मेमोरी कैश को उस अमूर्तता में जाना चाहिए। आपने रिपोजिटरी पैटर्न का उल्लेख किया है, यह आईएमएचओ की अच्छी पसंद होगी।

आपका वास्तुकला मोटे तौर पर इस तरह दिखना चाहिए:

adapter -> repository -> |-> cache 
         |-> database 

भंडार डेटा एक्सेस (अपने डीएओ) और कैश हैंडलिंग (अपने CacheManager) के लिए तर्क को जोड़ती है। भंडार हमेशा पहली बार कैश की जांच करेगा और फिर डेटाबेस से डेटा लाएगा। यदि गैर-कैश किए गए डेटा को लाया जाता है तो यह कैश को भी अपडेट करता है। इसके अलावा, यह डेटाबेस पर अद्यतन के लिए रजिस्टर करता है। जैसे ही डेटाबेस बदले गए डेटा के लिए अधिसूचित करता है, रिपोजिटरी को कैश को अपडेट करने और/या दृश्य को अधिसूचना प्रसारित करने का मौका होता है। महत्वपूर्ण हिस्सा यह है कि भंडार का इंटरफ़ेस इस तर्क को छुपाता है; यह केवल डेटा तक पहुंच प्रदान करता है।

आपको अपने एडाप्टर को अपने भंडार के साथ काम करने का एक तरीका खोजने की आवश्यकता है। मैं एंड्रॉइड के Loader यांत्रिकी का सुझाव दूंगा। इसके द्वारा आप मुफ्त में एसिंक्रोनस लोडिंग और सही जीवन चक्र हैंडलिंग प्राप्त करते हैं। यह भी अच्छी तरह से decouples एडाप्टर और भंडार।

यदि आपको रिपोजिटरी पैटर्न को लागू करने के तरीके पर कुछ प्रेरणा की आवश्यकता है, तो googlesamples/android-architecture गीथब में देखें। Clean Architecture branch आपके लिए एक अच्छा फिट हो सकता है।

एक तरफ नोट: अपने डेटा की वास्तविक (अद्वितीय) कुंजी खोजने का प्रयास करें। डेटा सूची में स्थिति का उपयोग करना आमतौर पर एक बुरा विचार है और आपके डेटा की संरचना के आधार पर दृश्य में अजीब दुष्प्रभाव होंगे।

+0

लेकिन क्या प्रेजेंटर के बिना एडाप्टर से रिपोजिटरी का उपयोग करना एक बुरा अभ्यास नहीं है? मैंने डीएओ कक्षा में अपना कैश लागू किया है और इसे एडाप्टर से बुलाया है, लेकिन "मुझे इसके बारे में बुरा लगा है"। पीएस मेरी कुंजी एक साधारण स्थिति नहीं है, यह सिर्फ स्थिति पर निर्भर करता है। एफ (स्थिति) = कुंजी – shagi

+0

आप सही हैं। यही कारण है कि मैंने लोडर्स का उपयोग करने का सुझाव दिया: (1) आपका प्रस्तुतकर्ता लोडर (प्रारंभिकरण, परिणाम कॉलबैक, आदि) से संबंधित है; (2) लोडर भंडार से डेटा लोड करता है; (3) प्रस्तुतकर्ता लोडर के परिणाम कॉलबैक और एडाप्टर – Brian

+0

पर डेटा पर हाथ लेता है लोडर्स के बजाय ठीक है मैं आरएक्स का उपयोग करता हूं। तो मुझे प्रारंभिकरण का विचार मिला है, लेकिन व्यूहोल्डर्स की कार्रवाइयों के बारे में क्या? क्या मुझे अपने एडाप्टर में इंटरफेस बनाना चाहिए और फिर फ्रैगमेंट \ गतिविधि या प्रेजेंटर ओओ में कार्यान्वित करना चाहिए? या संवाद करने का बेहतर तरीका है? RxBus (EventBus)? – shagi

1

मुझे लगता है कि यह एक वास्तुकला विषय है। आरएक्स विषय से बाहर है। उदाहरण के लिए एक भंडार के लिए, आरएक्स इसे लागू करने का एक तरीका है, और विस्तार से, इसकी कैश।

एक Google भंडार वास्तुकला के कुछ नमूने प्रदान करता है।उनमें से एक एक बुनियादी एमवीपी साथ वास्तुकला का एक उदाहरण है, और भंडार जो प्रबंधन कैश:

googlesamples/android-architecture/todo-mvp

आरएक्स के साथ एक ही भंडार में एक और उदाहरण:

googlesamples/android-architecture/todo-mvp-rxjava

हम हो सकता है यहाँ देखा है कि इन दो उदाहरणों वास्तुकला का एक ही योजना का हिस्सा:

enter image description here

+0

हां, मुझे डेटा कैशिंग करने का विचार समझा गया है) आखिरी सवाल जो मेरे लिए स्पष्ट नहीं है एडाप्टर और प्रेजेंटर को कैसे कनेक्ट करें? पिछली उत्तर – shagi

+0

@shagi IMHO पर टिप्पणी, आपके प्रस्तुतकर्ता में आप डेटा प्राप्त करने के लिए अपनी रिपोजिटरी या अपने व्यावसायिक तर्क को कॉल करते हैं (आप यहां आरएक्स का उपयोग कर सकते हैं)। प्रेजेंटर डेटा संचारित करने के लिए खंड से एक विधि को कॉल करता है। टुकड़ा एडाप्टर और यह तर्क लागू करता है। एडाप्टर/खंड यूआई घटनाओं को सुनें (आप यहां आरएक्स का उपयोग कर सकते हैं) और प्रस्तुतकर्ता की एक विधि को कॉल करें। प्रस्तुतकर्ता में यूआई घटनाओं के बाद कुछ करने के लिए तर्क शामिल है। – compte14031879

+1

आरएक्स के साथ एक ही उदाहरण से विवरण। टुकड़ा और एडाप्टर (कोई आरएक्स यहाँ इस्तेमाल नहीं किया गया है! यदि आप यहां आरएक्स का उपयोग करते हैं, तो यह यूआई घटनाओं के लिए है): https://github.com/googlesamples/android-architecture/blob/todo-mvp-rxjava/todoapp/app/src/main /java/com/example/android/architecture/blueprints/todoapp/tasks/TasksFragment.java - प्रस्तुतकर्ता (आरएक्स यहां रिपोजिटरी के पर्यवेक्षक की सदस्यता लेने के लिए उपयोग किया जाता है): https://github.com/googlesamples/android-architecture/blob/ कार्य करने की एमवीपी-rxjava/todoapp/ऐप्स/src/मुख्य/जावा/com/उदाहरण/एंड्रॉयड/वास्तुकला/ब्लूप्रिंट/todoapp/कार्य/TasksPresenter.java – compte14031879

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