10

मैं AsyncTask को रद्द करना चाहता हूं। मुझे लगता है कि आप (जो हुड के नीचे AtomicBoolean का उपयोग करता isCancelled()in this valid solution की तरह उपयोग कर सकते हैंरद्द करने के लिए मजबूर करने के लिए AsyncTask को समय-समय पर चेक इन फ्लैग नहीं किया जाना चाहिए inInBackground अस्थिर हो?

लेकिन मैं suspiciousSolution1, suspiciousSolution2, suspiciousSolution3 जहां नया झंडा private boolean isTaskCancelled = false; शुरू की है की तरह समाधान देख

और मैं सोच रहा शुरू कर दिया -।। कि जब झंडा

public void cancelTask(){ 
    isTaskCancelled = true; 
} 

जो कुछ धागे पर चलता में संशोधित किया गया है, और

में पढ़ा जाता है

जो WorkerThread में चलता है, तो फ्लैग isTaskCancelled फ़्लैग नहीं होना चाहिए (या AtomicBoolean Google के कार्यान्वयन के रूप में)।

+0

हाँ, यह शायद अस्थिर – thepoosh

+0

गूगल दिशानिर्देशों के अनुसार होना चाहिए, AsyncTask बहुत छोटे समारोह करने के लिए इस्तेमाल किया जाना चाहिए। यह बड़ी लूप या भारी कार्यों को नहीं चलाना चाहिए। ऐसी सुविधाओं के लिए या तो हैंडलर और रननेबल या पृष्ठभूमि सेवा का उपयोग करें। ध्वज मौजूद है लेकिन यह केवल आपकी स्थिति की शुरुआत में ही मान्य होगा। कार्य वांछित के रूप में तुरंत रद्द या रद्द नहीं कर सकता है। – chejaras

+0

धन्यवाद लेकिन आप टिप्पणी quesiton का जवाब नहीं है। –

उत्तर

5

हां, यह volatile होना चाहिए। अन्यथा थ्रेड ए में चर के लिए एक लिखना ऑप्टिमाइज़न (कंपाइलर, जेवीएम, आदि द्वारा) थ्रेड बी में पढ़ने के लिए दिखाई नहीं दे सकता है। देखें this

+0

हां। एक निष्पादक का समर्थन करने वाले थ्रेड पूल में कई धागे में से एक पर 'doInBackground' चलाया जा रहा है। यह असंभव है कि 'रद्द टास्क' उसी धागे से चलाया जाएगा। इसका मतलब है कि 'isTaskCancelled' को एकाधिक थ्रेड से एक्सेस किया गया है और' अस्थिर 'होना चाहिए। 'AsyncTask' ढांचा स्वयं' परमाणु Boolean' का उपयोग करता है –

0

हां, अस्थिर। यह ध्यान में रखते हुए कि आप समय-समय पर अपने एसिन्टास्क की जांच करने के लिए इसका उपयोग कर रहे हैं। यदि यह एकाधिक धागे थे तो मैं परमाणु क्षेत्रों का उपयोग करने का सुझाव दूंगा। कृपया यहां अधिक जानकारी देखें: volatile vs atomic & Volatile boolean vs AtomicBoolean

2

यह

प्रारंभ

प्रयास करें
private AysncTask aysncTask; 

टास्क कॉल

aysncTask=new AysncTask(); 
     aysncTask.execute(); 

टास्क रद्द अपने इच्छित स्थान पर

if (aysncTask != null && aysncTask.getStatus() == aysncTask.Status.RUNNING){ 
     aysncTask.cancel(true); 

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