2017-03-16 27 views
5

मैं एंड्रॉइड यूआई थ्रेड के संदर्भ में सह-दिनचर्या के उपयोग की खोज कर रहा हूं। में वर्णित अनुसार मैंने contextJob लागू किया। पृष्ठभूमि कार्य जीयूआई से देखा गया है और मैं इसे प्रत्येक क्लिक पर फिर से शुरू करना चाहता हूं (वर्तमान में चल रहे एक को रोकें और इसे फिर से शुरू करें)।क्या जॉब इंस्टेंस का पुन: उपयोग करने का कोई तरीका है?

लेकिन एक नौकरी एक बार रद्द कर दिया तो भी एक बच्चे को नौकरी बनाने पुन: उपयोग नहीं किया जा सकता है:

val job = Job(contextJob) 

और रद्द करने में यह मदद नहीं करता है, क्योंकि यह हो-पुन: सौंपा गया है।

क्या जॉब इंस्टेंस का पुन: उपयोग करने का कोई तरीका है?

उत्तर

4

Job डिजाइन द्वारा एक बहुत ही सरल जीवन चक्र है। इसकी "पूर्ण" स्थिति अंतिम है, जो एंड्रॉइड Activity की "नष्ट" स्थिति के समान ही है। तो, एक माता-पिता Job गाइड में समझाए गए अनुसार Activity से संबद्ध होना सर्वोत्तम है। अगर आपको गतिविधि नष्ट हो जाती है तो आपको केवल माता-पिता की नौकरी रद्द करनी चाहिए। क्योंकि एक नष्ट गतिविधि का पुन: उपयोग नहीं किया जा सकता है, आप कभी भी अपनी नौकरी का पुन: उपयोग करने की आवश्यकता में भाग नहीं लेंगे।

प्रत्येक क्लिक पर काम शुरू करने के लिए अनुशंसित दृष्टिकोण अभिनेताओं का उपयोग करके है, क्योंकि वे आपको अनौपचारिक सहमति से बचने में मदद करते हैं। गाइड दिखाता है कि प्रत्येक क्लिक पर उन्हें कैसे शुरू किया जाए, लेकिन यह दिखाता नहीं है कि वर्तमान में चल रही कार्रवाई को कैसे रद्द किया जाए।

fun View.onClick(action: suspend() -> Unit) { 
    var currentJob: Job? = null // to keep a reference to the currently running job 
    // launch one actor as a parent of the context job 
    // actor prevent concurrent execution of multiple actions 
    val eventActor = actor<Unit>(contextJob + UI, capacity = Channel.CONFLATED) { 
     for (event in channel) { 
      currentJob = Job(contextJob) // create a new job for this action 
      try { 
       // run an action within its own job 
       withContext(currentJob!!) { action() } 
      } catch (e: CancellationException) { 
       // we expect it to be cancelled and just need to continue 
      } 
     } 
    } 
    // install a listener to send message to this actor 
    setOnClickListener { 
     currentJob?.cancel() // cancel whatever job we were doing now (if any) 
     eventActor.offer(Unit) // signal to start next action when possible 
    } 
} 

एक अभिनेता हमेशा सक्रिय रहती है अपनी मूल काम जब तक (एक गतिविधि से जुड़ा हुआ:

आप बाकी सब से अलग कोड रद्द करने योग्य का एक ब्लॉक बनाने के लिए withContext के साथ एक संयोजन में Job के एक ताजा उदाहरण की आवश्यकता होगी) रद्द कर दिया है। एक अभिनेता क्लिक के लिए इंतजार कर रहा है और प्रत्येक क्लिक पर action शुरू करता है। हालांकि, action के प्रत्येक आमंत्रण को में withContext ब्लॉक का उपयोग करके लपेटा गया है, ताकि इसे अपने मूल नौकरी से अलग से रद्द किया जा सके।

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

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

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