2013-09-25 6 views
8

तक पहुँचने मैं सफलतापूर्वक बनाने दोनों & पोस्ट कॉल प्राप्त है और यह भी कि निगमित रेट्रोफिट एपीआई बाकी ग्राहक बना लिया है Robospice एक पृष्ठभूमि सेवा के रूप में।Robospice/रेट्रोफिट पृष्ठभूमि सेवा डेटाबेस

हालांकि, मैं Robospice सेवा डेटाबेस से कनेक्ट करना चाहते हैं और अतुल्यकालिक रूप से से लिया गया वस्तुओं जारी रहती है कॉल प्राप्त करें। रेट्रोफिटCallback वर्ग स्पष्ट तरीका लगता है का उपयोग करते हुए, लेकिन डेटाबेस से कनेक्ट Context की आवश्यकता है और मैं "Context लीक के बारे में चिंतित हूँ।

तो

, कौन-सा डेटा लागू करने के लिए RobospiceSpiceService प्राप्त करने के लिए सबसे अच्छा तरीका हो सकता है डेटाबेस के लिए दोनों से पहले और एक अनुरोध पोस्ट कार्रवाई की जा रही?

उत्तर

2

अंत में, के रूप में मैं विभिन्न बाकी एपीआई सेवा batching कर रहा हूँ रेडियो (Reto Meier Dev Bytes: Efficient Data Transfers), मैं बाकी एपीआई सेवाओं फोन को बचाने के लिए कॉल (RetrofitSpiceService रों) एक नियंत्रकके भीतर सेDatabaseHelper (Context की आवश्यकता) और संबंधित शेष सेवाओं के लिए संबंधित Retrofit कॉलबैक दोनों संदर्भ शामिल हैं।

इस तरह, नियंत्रक सेवा संभालती सभी ट्रिगर (AlarmManager नियंत्रक सेवा चलाता है) और डीबी और बाकी सेवाओं के लिए बने context, database या उस तरह की जानकारी के बिना सामान्य रूप में खुद को बंद कर सकते हैं।

@ lion789 के लिए:
मैं एक इसी API कॉल के साथ प्रत्येक 4 मॉडल सर्वर (1 पोस्ट, 3 प्राप्त) के साथ सिंक करने की है। प्रत्येक मॉडल/API कॉल के लिए एक -
इन सिंक कॉल संभाल करने के लिए, मैं एक IntentService कि 4 SpiceManager विशेषता और 4 रेट्रोफिटCallback वर्गों में शामिल किया है।
IntentServiceEnum पारित किया गया है जो एपीआई के अनुक्रम को इंगित करता है जिसे कॉल किया जाना चाहिए।
IntentService उचित SpiceManager पर कॉल करता है जो चलता है, तो Callback दृढ़ता को ट्रिगर करता है और अनुक्रम में अगली एपीआई कॉल को ट्रिगर करने के लिए IntentService विधि को कॉल करता है।

बहुत इसका सारणित और इंटरफेस किया गया है क्योंकि मैं इसे अपने ऑथ और पुश पंजीकरण कोड के लिए उपयोग करता हूं, इसलिए यह वर्णन करने के लिए एक दुःस्वप्न का थोड़ा सा है लेकिन यह अब तक बहुत अच्छी तरह से काम कर रहा है।

+0

अरे मैं वास्तव में Robospice का उपयोग करने के रूप में अच्छी तरह @ Lion789 के लिए और अधिक जानकारी प्रदान करने के लिए अपने जवाब संपादित रेट्रोफिट – Lion789

+1

साथ डाटा को कैश करने के लिए कोशिश कर रहा हूँ आप इस का एक उदाहरण है ...। अगर आपको और जानकारी चाहिए तो मुझे बताएं। – saywhatnow

+0

धन्यवाद, वास्तव में उत्सुक था, अगर मेरे पास ठीक है httpClient और retrofit, क्या कैशिंग स्वचालित रूप से अर्थ होता है मुझे तब रोबोस्पीस का उपयोग करने की आवश्यकता नहीं है? – Lion789

2

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

शायद मुझे कुछ याद आ रहा है। इसलिए, यदि आपकी आवश्यकता वास्तव में डेटा को स्वयं जारी रखना है, तो आपके द्वारा प्रस्तावित दृष्टिकोण सही दिखता है। आप अपने अनुरोध के अंदर मसाला सेवा को इंजेक्ट कर सकते हैं (देखें उदाहरण के लिए retrofitSpiceService में addRequest ओवरराइड कैसे है)।अनुरोध तब एक संदर्भ रखेगा जिसका उपयोग कॉलबैक के अंदर दृढ़ता के लिए किया जा सकता है, या अनुरोध के अंदर ही किया जा सकता है।

हाल ही में मैंने रेट्रोफिट और आरएस का उपयोग करके एक POST अनुरोध कोडित किया है। मैंने शून्य अनुरोध वापस करने के लिए POST अनुरोध के हस्ताक्षर को बदल दिया। फिर उस मामले से निपटने के लिए रेट्रोफिट कनवर्टर को थोड़ा संशोधित किया और शून्य वापस कर दिया। अनुरोध को पहले बताए गए इंजेक्शन के माध्यम से मसाला सेवा प्राप्त हुई और डेटाबेस पर कुछ क्रियाएं कर सकती थीं।

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

@Override 
    public void addRequest(CachedSpiceRequest<?> request, 
        Set<RequestListener<?>> listRequestListener) { 
      if (request.getSpiceRequest() instanceof MySpiceRequest) { 
        MySpiceRequest<?> mySpiceRequest = (MySpiceRequest<?>) request 
            .getSpiceRequest(); 
        mySpiceRequest.setApplication(this.getApplication()); 
      } 
      super.addRequest(request, listRequestListener); 
    } 
संबंधित मुद्दे