2012-03-06 14 views
8

नष्ट मैं आमतौर पर एक अलग नियंत्रक वर्ग है, जो Activityरोक हैंडलर runnable कार्यों जब गतिविधि

@Override 
public boolean handleMessage(int what, Object data) { 
    switch (what) { 
    case ExerciseViewEvent.STARTUP: 
     workerHandler.post(new Runnable() { 
      public void run() { 
       onStartup(); 
      } 
     }); 
     return true; 
} 

इस से घटनाओं से निपटने के लिए एक विशेष विधि है आदेश यूआई धागा उत्तरदायी रखने के लिए और किया जाता है करने के लिए सभी क्रियाएँ घटनाओं प्रतिनिधि पृष्ठभूमि कार्यों में सभी computations बनाओ।

हालांकि, जब Activity.onDestroy() विधि प्रणाली द्वारा कहा जाता है, controller.dispose() विधि कहा जाता है, जो नियंत्रक में सभी सामान इस तरह

@Override 
protected synchronized void dispose() { 
    ................. 
    if (model != null) { 
     synchronized (model) { 
      model.dispose(); 
     } 
     model = null; 
    } 
    helper = null; 
    ..................... 
    super.dispose(); 
} 

आप देख सकते हैं, नियंत्रक के निपटान यूआई धागा में होता है को साफ, बिना इसे एक हैंडलर धागे में सौंपना।

समस्या

होता है जब, उदाहरण के लिए, onDestroyonStartup() विधि के बीच में कहा जाता है: onDestroy मॉडल और अन्य सभी संदर्भों को साफ, लेकिन onStartup विधि के अंदर यह कुछ बिंदु पर मॉडल का उपयोग करने की कोशिश करता है, लेकिन यह है पर विचार null, एक अपवाद फेंक दिया गया है।

इस मुद्दे को हल करने का सबसे अच्छा तरीका क्या है? मैं हर नियंत्रक विधि को लॉक नहीं करना चाहता क्योंकि उनमें से कुछ एक दूसरे के बीच हस्तक्षेप किए बिना एक साथ हो सकते हैं।

+0

इसके अलावा, यह संभव है कि सिस्टम द्वारा डेस्ट्रॉय विधि को नहीं बुलाया जाए। – Yury

+0

अच्छी बात यूरी, लेकिन अगर इसे नहीं कहा जाता है, तो गतिविधि द्वारा आवंटित सभी वस्तुओं को स्वयं JVM द्वारा नष्ट कर दिया जाता है? तो मुझे इसके बारे में चिंता करने की ज़रूरत नहीं है, है ना? निपटान में मैंने केवल सभी वस्तुओं का निपटारा किया है, और कुछ नहीं। –

उत्तर

4

निपटान() विधि में आपको मॉडल का निपटान करने से पहले कार्यकर्ता हैंडलर को साफ करना चाहिए। हैंडलर क्लास में removeCallbacks या removeCallbacksAndMessage(null) विधियां देखें। बाद की विधि सभी कॉलबैक और संदेशों को हटा देती है जब तर्क null होता है।

+0

कर्मचारी हैंडलर हैंडलर का प्रकार है। मैं पोस्ट() विधि का उपयोग कर इस हैंडलर में जोड़े गए सभी रननेबल को कैसे रद्द कर सकता हूं? –

+0

मैंने उत्तर –

+0

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

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