2016-09-11 5 views
6

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

मुझे क्या मालूम: जब मैं एक डेटाबेस संदर्भ के लिए एक ValueEventListener देते हैं, मुझे लगता है मैं बाद में इसे हटाने के लिए (कि बाहर कुछ बड़े पैमाने पर स्मृति रिसाव के साथ अब मुश्किल तरीके खोजने की जरूरत है पता

क्या मैं। पता नहीं: मैं भी अन्य सभी श्रोताओं को अलग करने की आवश्यकता है (यह Firebase डाटाबेस, भंडारण, और प्रमाणीकरण शामिल करने के लिए, तीन API मैं उपयोग कर रहा हूँ है)

उदाहरण:

UploadTask uploadTask = ref.putFile(uploadFile); 

uploadTask.addOnFailureListener(new OnFailureListener() { 
    //@Override code here 
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TakeSnapshot>() { 
    //@Override code here 
}).addOnProgressListner(new OnProgressListner<UploadTask.TakeSnapshot>() { 
    //@Override code here 
}; 

मुझे लगता है कि मुझे आपके मतलब का बिंदु दिखाने के लिए पर्याप्त है। इस प्रकार मेरा वास्तविक कोड वर्तमान में संरचित है।

सवाल:

  1. मैं सिर्फ मामले गतिविधि समाप्त होता है में उन श्रोताओं के सभी दूर करने के लिए (सिस्टम निर्णय, फोन मर जाता है, जो कुछ भी) से पहले कि कॉलबैक होता है की जरूरत है?
  2. मैं उन्हें किसी भी तरह ऊपर बंडल और उन्हें तीनों ही बार में समाप्त क्योंकि मैं अपने कोड में इनमें से 30 की तरह है और वास्तव में चर के इन सभी श्रोताओं आवंटित करने के लिए आदेश में यह सभी के पुनर्गठन की तरह नहीं लग रहा है सिर्फ इसलिए मैं उन्हें "हटाएंब्लैब्लूब्लहब्लैला लिस्टनर (श्रोता बनाने योग्य)" में और अधिक पास कर सकता हूं।
  3. थोड़ा सा विषय बंद करें, लेकिन, मैं अपने सभी कोड से ऑनस्टार्ट पर जाने के लिए बहुत आलसी हूं ... इन सभी श्रोताओं को हटाने, चीजों को खत्म करने, कॉल खत्म करने() (या जो भी हो) को हटाने के लिए मेरे लिए बुरा अभ्यास है यह है कि एक गतिविधि को मार देता है, हालांकि मुझे लगता है कि इसकी गारंटी नहीं है) और केवल स्क्रैच से गतिविधि को फिर से बनाएं? यह एक छोटा सा ऐप है इसलिए गतिविधि को फिर से बनाने का ओवरहेड कोई बड़ी बात नहीं है। सिर्फ "सही" क्या उत्सुक है।

मुझे लगता है कि यह खराब योजना और ज्ञान की कमी का परिणाम है (मैं केवल मज़े के लिए प्रोग्राम, दुर्भाग्य से नौकरी के लिए नहीं) इसलिए यदि मुझे कठिन मार्ग लेना है तो मुझे लगता है कि यह एक सीखने का अनुभव है, है ?

+1

पर उलझन में हैं। आपके द्वारा दिखाया गया उदाहरण कोड फायरबेस स्टोरेज के लिए एक प्रगति श्रोता है। लेकिन आपका पाठ डेटाबेस के बारे में स्पष्ट रूप से है। आपको किसके साथ समस्या है? –

+1

भ्रम फ्रैंक के बारे में क्षमा करें। मैं और अधिक स्पष्ट हो सकता था। मैं फायरबेस से दोनों एपीआई (डीबी और स्टोरेज) का उपयोग कर रहा हूं और दोनों में श्रोताओं का उपयोग कर रहा हूं। मेरा सवाल वास्तव में मुझे लगता है कि दोनों पर लागू करने के लिए था। मुझे लगता है कि सामान्य रूप से फायरबेस श्रोताओं और जब वे करते हैं और अलग/हटाए जाने की आवश्यकता नहीं होती है। उदाहरण के लिए, क्या कुछ एफबी श्रोताओं हैं जो गतिविधि को बाहर ले जाने पर स्वयं का ख्याल रखते हैं या क्या प्रत्येक एकल श्रोता (डीबी और स्टोरेज) पर रोकें/रोकें/नष्ट करें आदि – Ryan

उत्तर

4

एक गतिविधि बंद होने पर ऑटो अनियंत्रित श्रोताओं एंड्रॉइड और इसके व्युत्पन्न वर्ग (स्टोरेजटास्क) में कक्षा "कार्य" पर एक विशेषता है।

इसका मतलब है आप कुछ इस तरह कर सकते हैं:

UploadTask uploadTask = ref.putFile(uploadFile); 

uploadTask.addOnFailureListener(thisActivity, new OnFailureListener() { 
//@Override code here 
}).addOnSuccessListener(thisActivity, new OnSuccessListener<UploadTask.TaskSnapshot>() { 
//@Override code here 
}).addOnProgressListner(thisActivity, new OnProgressListner<UploadTask.TaskSnapshot>() { 
//@Override code here 
}; 

आप कार्य के साथ ऐसा कर सकते हैं के रूप में इस तरह के setValue के रूप में वास्तविक समय डेटाबेस से लौटे वस्तुओं:

databaseReference.setValue("newValue").addOnSuccessListener(thisActivity, ...) 

तो जवाब देने के लिए अपने सीधे प्रश्न:

  1. स्वचालित रूप से अपंजीकृत करने के लिए गतिविधि स्कॉप्ड संस्करण का उपयोग करें गतिविधि बंद पर श्रोताओं। ध्यान दें कि स्टोरेज के लिए, जब आप स्टोरेज रिफरेंस का उपयोग शुरू करते हैं तो आप चल रहे संचालन से पूछ सकते हैं।getActiveUploadTasks और StorageReference.getActiveDownloadTasks और पुनः सदस्यता लें।

  2. स्कॉप्ड श्रोताओं का उपयोग करते समय आपको मैन्युअल रूप से सदस्यता समाप्त करने की आवश्यकता नहीं है। मुझे गैर-कार्य आधारित श्रोताओं की सदस्यता समाप्त करने का तरीका नहीं पता है।

  3. अच्छी तरह से मुझे यकीन नहीं है कि आप कैसे गारंटी दे सकते हैं कि ओएस हमेशा इसे रोकने/शुरू करने के बजाय आपके कार्य को मार देगा - और आपके फिनिश कोड को चलाने के लिए कैसे गारंटी दी जाएगी। मैं सलाह देता हूं कि आप कोड को

+0

शानदार! धन्यवाद। उत्कृष्ट उत्तर और वास्तव में वह जानकारी जो मैं ढूंढ रहा था। तो जहां आप भंडारण उदाहरणों में "यह सक्रियता" डालते हैं, वही है जैसे मैंने "यह" रखा है या "यह" गतिविधि के अलावा कुछ और वर्णन करता है? मैं देखता हूं कि मैं "this.getCallingActivity" और कुछ अन्य चीजें कर सकता हूं। क्या आप मुझे बता सकते हैं कि गतिविधि का संदर्भ देने का सही तरीका क्या है, इसलिए मैं कुछ और संदर्भ देने का अंत नहीं करता? साथ ही, मैं आपकी सलाह लेता हूं और ऑनस्टार्ट() पर अपने कुछ ऑनक्रेट() तर्क को स्थानांतरित करता हूं। यह शुरू करने के लिए वहां होना चाहिए था। सबक सीखना कठिन तरीका! ;) – Ryan

+2

आमतौर पर "यह" गतिविधि के कोड के अंदर गतिविधि को संदर्भित करता है। हालांकि, यदि आप नेस्टेड क्लास या कॉलबैक रूटीन के अंदर हैं तो यह नहीं हो सकता है। यदि आप स्वयं को वहां पाते हैं, तो आप विशेष रूप से "इस" को एक प्रकार के साथ अर्हता प्राप्त करके गतिविधि का संदर्भ दे सकते हैं - जैसा कि "MainActivity.this" –

+0

में है कि अंतिम टिप्पणी केवल केक पर आईकिंग डालती है। स्मृति रिसाव हल हो गया :) – Ryan

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

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