2012-08-22 11 views
6

प्लेस चेंज पर गतिविधि स्थिति को अपडेट करने का सबसे अच्छा अभ्यास क्या है? कल्पना कीजिए कि आपके पास एक गतिविधि है जो श्रेणी में वस्तुओं की सूची और सूची की सूची प्रदर्शित करती है। यदि अलग-अलग श्रेणी का चयन किया जाता है तो ऐप श्रेणी आईडी के साथ नई जगह पर जाता है। मैं चाहता हूं कि केवल आइटम रीफ्रेश करें और नई गतिविधि न बनाएं जो श्रेणी सूची को फिर से पढ़े।प्लेस चेंज पर जीडब्ल्यूटी एमवीपी अपडेटिंग गतिविधि स्थिति

मेरे वर्तमान दृष्टिकोण इस तरह है:

public class AppActivityMapper implements ActivityMapper { 

    private ItemListActivity itemListActivity; 

    ... 

    public Activity getActivity(final Place place) { 
     final Activity activity; 

     if (place instanceof ItemListPlace) { 
      if (itemListActivity == null) { 
       itemListActivity = new ItemListActivity((ItemListPlace) place, clientFactory); 
      } else { 
       itemListActivity.refresh((ItemListPlace) place); 
      } 
      activity = itemListActivity; 
     } else { 
      itemListActivity = null; 
     } 

     ... 
     return activity; 
    } 

    ... 

उत्तर

5

विकल्प हैं:

  • (गतिविधि में PlaceChangeEvent रों को सुनने के आप तो एक FilteredActivityMapper और CachingActivityMapper उपयोग कर सकते हैं कैशिंग के लिए आपके ActivityMapper में गतिविधि के, ताकि यह पूछे जाने पर केवल एक नई गतिविधि को कम किया जा सके)। †

  • कुछ घटक PlaceChangeEvent रों सुनने और उन्हें व्यापार उन्मुख घटनाओं में अनुवाद किया है, गतिविधि तो नहीं बल्कि PlaceChangeEvent रों से उन घटनाओं के लिए, ऊपर के रूप में अन्यथा ही सुनता है।

  • "स्क्रीन" से गतिविधि दसगुणा, "स्क्रीन" एक reset() विधि के साथ एक सिंगलटन बनाने के लिए और (इस मामले में एक तर्क के रूप संभवतः गुजर श्रेणी आईडी) गतिविधि के start से कि विधि कॉल। एक सिंगलटन होने वाली "स्क्रीन" तब केवल एक बार श्रेणियों की सूची लोड करना सुनिश्चित कर सकती है।

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

मैं व्यक्तिगत रूप से आपके दृष्टिकोण के साथ जाऊंगा हालांकि (एक छोटे अपवाद के साथ, नीचे देखें), क्योंकि यह सबसे आसान/आसान है। "स्क्रीन" से गतिविधि को डीकॉप्लिंग करना भी एक विकल्प है; जीडब्ल्यूटी टीम ने व्यय नमूना में इस दृष्टिकोण की खोज शुरू कर दी (दुर्भाग्य से इसे खत्म किए बिना एमवीपी का उपयोग करने के साथ वर्तमान जिम्मेदारी से गतिविधि जिम्मेदारी को कम करना)।

इसके अलावा, मुझे नहीं लगता कि सर्वोत्तम अभ्यास वास्तव में अभी के लिए उभरा है।


†। मुझे अपनी गतिविधियों को उन स्थानों के साथ जोड़ना पसंद नहीं है जिनके साथ उनका उपयोग किया जाता है (मुझे goTo कॉल के लिए युग्मन पसंद नहीं है, लेकिन अभी तक एक साफ और सरल विकल्प नहीं मिला है), इसलिए मैं नहीं चाहता इस विकल्प के साथ जाओ; और इसी तरह, मैं गतिविधि कन्स्ट्रक्टर और refresh विधि को आपके द्वारा किए गए तरीके से नहीं पास करता, बल्कि जगह से जानकारी निकालता हूं और गतिविधि को पास करता हूं (उदाहरण के लिए आपके मामले में, केवल गतिविधि के लिए श्रेणी आईडी दें , ItemListPlace उदाहरण नहीं; मैं बस सभी मामलों में setCategory पर कॉल करूंगा, और कन्स्ट्रक्टर को श्रेणी आईडी भी पास नहीं करूंगा)।

1

मैं एक नया काम करके या पिछले एक (या शून्य) देकर, एक गतिविधि को वापस छोड़कर अपने सक्रिय मैमैपर में कोई तर्क नहीं करता। मेरे अनुसार, मैपर को ताज़ा करने के बारे में पता नहीं है() या कौन सी गतिविधियां करते हैं।

यदि ऐसा है, तो 'रीफ्रेश()' का तर्क उस टोकरी के स्थान पर सक्रियण को दिया जाएगा। उस टोकन के बारे में जानकारी होनी चाहिए कि अनुरोध की स्थिति क्या है (एक नया पृष्ठ, पुनः लोड, एक आईडी, आदि)।

गतिविधि में, सबसे पहले, यह देखने के लिए पूछता है, इस गतिविधि से संबंधित एक (टिप: 'क्लाइंटफैक्टरी' द्वारा दिया गया एक सिंगलटन अच्छा अभ्यास है), फिर यह उस दृश्य के लिए प्रेजेंटर बनाता है, और उन्हें बांधता है साथ में।

आखिरकार, गतिविधि प्रस्तुतकर्ता को राज्य के बारे में कोई जानकारी प्रदान करने के लिए जगह से टोकन का उपयोग करेगी। और फिर, यह पृष्ठ में दृश्य जोड़ता है।

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

आशा है कि आपको अपने मामले के लिए एक अनुकूलित समाधान मिलेगा। सौभाग्य।

3

मेरी राय में,

  • ActivityMapper की भूमिका तुम वापस एक Activity एक Place से दे रहा है।
  • ActivityManager की भूमिका ActivityMapper से वापस दी गई है और यदि अलग हो तो वर्तमान को रोकने के लिए है। आपके मामले में आप वर्तमान Activity "अपडेट/रीफ्रेश" करना चाहते हैं।

तो मैं ActivityMapper तो संशोधित रूप में यह allways मुझे वापस Activity का एक ही उदाहरण Place की दी गई प्रकार के लिए दे देंगे होगा। ऐसा करने का एक अच्छा तरीका जीआईएन का उपयोग करना और आपके Activity इंजेक्ट करने के लिए सिंगलटन स्कोप ...in(Singleton.class) का उपयोग करना हो सकता है।

यदि आप ऐसा करते हैं, तो यूआरएल को बदलते समय, यदि स्थान वही रहता है (जिसका अर्थ है कि आपके यूआरएल के पास # और उसके बाद का एक ही शब्द है :) ताकि आपकी जगह का प्रकार वही रहता है, ActivityMapper आपको Activity का एक ही उदाहरण वापस करें ताकि ActivityManagerActivity पर कुछ भी नहीं करेगा। ActivityManager

if (currentActivity.equals(nextActivity)) { 
    return; 
} 
if (currentActivity.equals(nextActivity)) { 
    return; 
} 

मेरे लिए आपके पास 2 विकल्प हैं। थॉमस ने कहा, पहला, PlaceChangeEvent को अपने Activity में सुनना है। आपको प्राप्त होने वाले नए यूआरएल के आधार पर नया Place प्राप्त होगा और आप अपने Activity को "अपडेट/रीफ्रेश" कर सकते हैं।

दूसरा एक, कि मैं गतिविधि/प्लेस पैटर्न के साथ लाइन में अधिक जानकारी प्राप्त तो यह कहता है कि Activity पर एक अद्यतन (स्थान) विधि ActivityManager संशोधित करने के लिए जब ActivityActivityMapper द्वारा वापस दिए गए एक ही है कि वर्तमान Activity

मैंने अभी तक इनमें से किसी भी समाधान की कोशिश नहीं की है लेकिन मैं जल्द ही ... मैं उस समय उस पोस्ट को अपडेट करने में सक्षम हो सकता हूं।

You can find more information in this article I wrote on my blog on that topic

यह एक छोटा सा स्कीमा मैं मेरे पैटर्न को समझने में मदद करने के लिए बनाया है, आशा है कि यह मदद मिलेगी:

enter image description here

+0

आप दूसरा समाधान की कोशिश की? यह कैसे काम करता है या आपको ऐसा करने का बेहतर तरीका मिला है? – displayname

+0

क्षमा करें नहीं। :(नेवर को वास्तव में आवश्यकता थी। हम बस नए पैरा के साथ गतिविधि को फिर से लोड करते हैं। –

+0

ठीक है। मैं बस कोशिश कर रहा हूं कि मार्टिंग ऐसा कर रहा था। मुझे यकीन नहीं है कि क्या स्केल हैं लेकिन मैं इसे 'जगह उदाहरण' MainActivity' और यदि ऐसा है और शून्य नहीं है, तो मैं अपने मेन्यू में एक बटन पर क्लिक करने के बाद मुख्य सामग्री को अपडेट करने के लिए 'mainActivity.updateMainContent (place.getCurrentPlaceToken())' को कॉल करता हूं। ऐसा लगता है कि यह बहुत अधिक है मुख्य सामग्री को अद्यतन करना लेकिन वहां है .. – displayname

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