2017-06-27 6 views
7

जावा एंड्रॉइड में This class should be static or leaks might occur से निपटने के कई प्रश्न हैं।कोटलिन एंड्रॉइड में "यह AsyncTask क्लास स्थिर या लीक हो सकता है" के लिए सही दृष्टिकोण क्या है?

This Handler class should be static or leaks might occur: IncomingHandler

This Handler class should be static or leaks might occur:AsyncQueryHandler

This AsyncTask class should be static or leaks might occur (anonymous android.os.AsyncTask)

चेतावनी तथ्य यह है कि आंतरिक वर्ग बाहरी वर्ग के लिए एक अंतर्निहित संदर्भ रखती है, और इसलिए GC'd से बाहरी वर्ग को रोकने के कारण है। समाधान स्वयं चेतावनी में निहित है कि कक्षा को स्थिर घोषित किया जाना चाहिए।

हालांकि, समाधान जावा विशिष्ट है। यह देखते हुए कि कोटलिन के पास static संशोधक नहीं है, निकटतम चीज़ companion object है और साथी ऑब्जेक्ट इसके "बाहरी वर्ग" के संदर्भ में है।

नीचे मेरी [विफल] हैं टिप्पणी के साथ प्रयास करता

class MyActivity : AppCompatActivity(), MyListener { 

    companion object { 
     class Attempt3Task(val callback: MyListener) : AsyncTask<Unit, Unit, Unit>() { 
      override fun doInBackground(vararg params: Unit?) { 
       TODO("") 
      } 

      override fun onPostExecute(result: Unit?) { 
       callback.updateUi() 
      } 
     } 
    } 

    inner class Attempt2Task : AsyncTask<Unit, Unit, Unit>() { 
     override fun doInBackground(vararg params: Unit?) { 
      TODO(" 
     } 
    } 

    // Gives warning "This AsyncTask class should be static or leaks might occur" 
    val attempt_1 = object: AsyncTask<Unit, Unit, Unit>() { 
     override fun doInBackground(vararg params: Unit?) { 
      TODO("") 
     } 
    } 

    // Does not give warning but, as far as I can tell, is conceptually same as attempt_1 
    val attempt_2 = Attempt2Task() 

    // Does not give warning but companion object does have reference to the activity, no? 
    val attempt_3 = Attempt3Task(this) 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
    } 
} 

attempt2 और attempt3 सही भी है कि लिंटर बिना किसी चेतावनी के, कोड अभी भी लीक कर रहा है के बारे में दावा कर रहे हैं?

लीकिंग से बचने के लिए हमें क्या विकल्प हैं? क्या मुझे कॉलबैक के लिए WeakReference के सदस्य के साथ सादे पुराने शीर्ष-स्तर class MyTask : AsyncTask<Unit, Unit, Unit>() को हल करना चाहिए?

+0

मैं 'कहने के लिए करना चाहते हैं AsyncTask जितना संभव हो उतना स्थानीय होना चाहिए। इसलिए उपरोक्त सभी कोड गलत उपयोग हैं। जिसका मतलब है उपयोग के तुरंत बाद इसे निपटाना/छोड़ देना। –

+0

कोटलिन में नेस्टेड क्लास डिफ़ॉल्ट रूप से जावा में 'स्थिर वर्ग 'के बराबर हैं - क्या आपने' Attempt2Task' 'के' आंतरिक 'कीवर्ड को छोड़ने का प्रयास किया था? Https://kotlinlang.org/docs/reference/nested-classes.html –

+0

@JK देखें इंगित करने के लिए धन्यवाद! मैंने 'आंतरिक कक्षाओं' खंड को कई बार समझने के बिना पढ़ा है कि यह निहित है कि नेस्टेड कक्षाओं के बाहरी वर्ग के सदस्य तक कोई पहुंच नहीं है! – user2829759

उत्तर

1

आपके पास गतिविधि वर्ग के बाहर AsyncTask क्लास घोषणा क्यों नहीं है?

कोटलिन में जो गतिविधि के समान फ़ाइल में हो सकता है लेकिन गतिविधि वर्ग के ऊपर/नीचे।

इस तरह एक छुपा संदर्भ के बारे में कोई समस्या नहीं है।

यह भी सुनिश्चित करें कि अपने AsyncTask के अंदर श्रोता को केवल वीक रेफरेंस रखें।

कहा कि, मेरे हिसाब से, AsyncTask अतीत के अंतर्गत आता है, और अब आप इस तरह के RxJava, सह दिनचर्या, लोडर, आदि के रूप में कुछ और आधुनिक विकल्प का उपयोग करना चाहिए

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