दिलचस्प पोस्ट
दो अलग-अलग कॉलमों के लिए किसी अन्य एसक्यूएल तालिका से मिलान डेटा कैसे प्राप्त करें: इनर जॉइन एंड / या यूनियन? Xcode 4.2 डिबग स्टैक कॉल का प्रतीक नहीं है पृष्ठभूमि का उपयोग करने और अधिसूचना बनाने के लिए सेवा का उपयोग करना दिए गए संभाव्यता matlab के साथ यादृच्छिक संख्या उत्पन्न करें मैं पायथन में एक पेड़ को कैसे लागू कर सकता हूं? क्या कोई जावा में पायथन में डेटा संरचनाओं में बनाया गया है? IE10 में स्क्रॉलबार ओवरले, आप इसे कैसे रोकते हैं? USB ड्राइव अक्षर कैसे खोजें? Google क्रोम एक्सटेंशन – टूलबार आइकन पर क्लिक करते समय नया टैब खोलें जेनकिंस को एक पीसी से दूसरे स्थानांतरित करने के लिए कैसे? पायथन में "if" में एक ही मूल्य के लिए एकाधिक चर की तुलना करें? कैसे Django में PostgreSQL डाटाबेस सेटअप करने के लिए? एमएस एक्सेस एप्लिकेशन का परीक्षण करने का सर्वोत्तम तरीका है? अपवाद प्राप्त करना: 'स्प्रिंग सिक्योरिटी फ़िल्टरैन' नाम का कोई बीन परिभाषित नहीं किया गया है अजगर कैसे फ़ाइल को रिक्त या नहीं चेक करें मैं जेनकिंस सीआईआई को जीआईटी ट्रिगर के साथ कैसे मास्टर करने के लिए धक्का दे सकता हूं?

AsyncTask को कई बार निष्पादित करें

मेरी गतिविधि में मैं एक ऐसा क्लास का उपयोग करता हूं जो AsyncTask और एक पैरामीटर से फैली हुई है जो कि AsyncTask का एक उदाहरण है जब मैं mInstanceOfAT.execute("") कॉल mInstanceOfAT.execute("") हूँ तो सब ठीक है। लेकिन ऐप दुर्घटना जब मैं एक अपडेट बटन दबाता हूं जो फिर से AsyncTask को कॉल करता है (यदि नेटवर्क जॉब काम नहीं करता है)। कारण तब एक अपवाद दिखाई देता है जो कहता है

कार्य निष्पादित नहीं किया जा सकता है: कार्य को पहले ही निष्पादित कर दिया गया है (एक कार्य केवल एक बार निष्पादित किया जा सकता है)

मैंने एस्कास्कस्क के उदाहरण के लिए रद्द (सच) फोन करने की कोशिश की है, लेकिन यह या तो काम करता है एकमात्र समाधान अब तक एशिनटस्क के नए उदाहरणों को बनाने के लिए है। क्या यह सही तरीका है?

धन्यवाद।

वेब के समाधान से एकत्रित समाधान "AsyncTask को कई बार निष्पादित करें"

AsyncTask उदाहरणों को केवल एक बार उपयोग किया जा सकता है

इसके बजाय, अपने कार्य को केवल new MyAsyncTask().execute(""); जैसे कॉल करें new MyAsyncTask().execute("");

AsyncTask एपीआई डॉक्स से:

थ्रेडिंग नियम

कुछ थ्रेडिंग नियम हैं जो इस वर्ग के ठीक से काम करने के लिए किए जाने चाहिए:

  • कार्य आवृत्ति को UI थ्रेड पर बनाया जाना चाहिए।
  • UI थ्रेड पर निष्पादित (पैराम …) लागू होना चाहिए।
  • प्रीएक्सएक्टेक () पर कॉल न करें, PostExecute पर (परिणाम), doInBackground (परम …), प्रगति अद्यतन (प्रगति …) मैन्युअल रूप से।
  • कार्य केवल एक बार निष्पादित किया जा सकता है (यदि एक दूसरे निष्पादन की कोशिश की जाती है तो एक अपवाद फेंक दिया जाएगा।)

एएससीएनटीकस्क के आग-और-भूलने के उदाहरणों का कारण स्टीव प्रेंटिस के उत्तर में बहुत अच्छी तरह से किया गया है – हालांकि, जब आप एक एएससीएनटीस्क को निष्पादित करते हैं तो आप कितने समय तक सीमित होते हैं, आप थ्रैड चलते समय क्या करना चाहते हैं। ।

DoInBackground () में एक लूप के अंदर अपना निष्पादन योग्य कोड डालें और प्रत्येक निष्पादन को ट्रिगर करने के लिए एक समवर्ती लॉक का उपयोग करें। आप प्रकाशनों का उपयोग करके परिणामों को पुनः प्राप्त कर सकते हैं प्रगति () / पर प्रगति अद्यतन ()

उदाहरण:

 class GetDataFromServerTask extends AsyncTask<Input, Result, Void> { private final ReentrantLock lock = new ReentrantLock(); private final Condition tryAgain = lock.newCondition(); private volatile boolean finished = false; @Override protected Void doInBackground(Input... params) { lock.lockInterruptibly(); do { // This is the bulk of our task, request the data, and put in "result" Result result = .... // Return it to the activity thread using publishProgress() publishProgress(result); // At the end, we acquire a lock that will delay // the next execution until runAgain() is called.. tryAgain.await(); } while(!finished); lock.unlock(); } @Override protected void onProgressUpdate(Result... result) { // Treat this like onPostExecute(), do something with result // This is an example... if (result != whatWeWant && userWantsToTryAgain()) { runAgain(); } } public void runAgain() { // Call this to request data from the server again tryAgain.signal(); } public void terminateTask() { // The task will only finish when we call this method finished = true; lock.unlock(); } @Override protected void onCancelled() { // Make sure we clean up if the task is killed terminateTask(); } } 

बेशक, यह एएसआईएनसीटीस्क के पारंपरिक उपयोग की तुलना में थोड़ा अधिक जटिल है, और आप वास्तविक प्रगति रिपोर्टिंग के लिए publishProgress () का उपयोग छोड़ देते हैं। लेकिन अगर मेमोरी आपकी चिंता है, तो यह दृष्टिकोण सुनिश्चित करेगा कि रनटाइम पर केवल एक एएससीएनटीस्क ढेर में रहता है।

मैंने अपना रोटेशन कार्य स्थैतिक बना दिया है, जिससे मैंने रोटेशन परिवर्तनों पर उन्हें UI थ्रेड्स में संलग्न, अलगाव, और फिर से जोड़ने में मदद की। लेकिन आपके प्रश्न पर वापस जाने के लिए, मैं क्या करता हूं यह देखने के लिए एक झंडे बना है कि क्या धागा चल रहा है। जब आप थ्रेड को पुनरारंभ करना चाहते हैं तो मैं जांचता हूं कि यदि रोटेशन कार्य चल रहा है तो क्या यह एक चेतावनी है I अगर ऐसा नहीं है, तो मैं इसे रिक्त बना देता हूं और फिर एक नया निर्माण करता हूं, जो आप देख रहे त्रुटि के आसपास काम करेंगे। इसके अलावा, सफल समापन के बाद मैं पूरा रोटेशन जागरूक कार्य से बाहर निकलता हूं ताकि वह फिर से जाने के लिए तैयार हो।

मेरी भी यही समस्या थी। मेरे मामले में मेरे पास एक कार्य है जिसे मैं onResume( ) में करना चाहता हूं और onResume( )। इसलिए मैंने अपना असिंकटस्क स्थिर बना दिया, और इसे से उदाहरण प्राप्त करें अब हम अभी भी एक ही समस्या है

तो क्या मैं onPostExecute () में किया है यह है:

 instance = null; 

यह ध्यान में रखते हुए कि मैं स्थैतिक getInstance विधि में जांचता हूं कि मेरा उदाहरण रिक्त नहीं है, और मैं इसे बना देता हूं:

 if (instance == null){ instance = new Task(); } return instance; 

PostExecute में विधि इस उदाहरण को खाली कर देगी और इसे पुन: बनाएँ। बेशक यह कक्षा के बाहर किया जा सकता है

हां, यह सच है, डॉक्टर का कहना है कि केवल एक ऐशिनटस्क को निष्पादित किया जा सकता है।

हर बार जब आपको इसे इस्तेमाल करने की आवश्यकता होती है तो आपको उदाहरण देना होगा:

 // Any time if you need to call her final FirmwareDownload fDownload = new FirmwareDownload(); fDownload.execute("your parameter"); static class FirmwareDownload extends AsyncTask<String, String, String> { }