मेरे पास 2 ASyncTasks हैं, एक httpPost से एक मान पुनर्प्राप्त करता है और अन्य यूआई के कुछ तत्वों (एक सूचीदृश्य सहित) को अपडेट करता है। समस्या यह है कि चूंकि ASyncTasks समान पृष्ठभूमि थ्रेड साझा करते हैं, यदि नेटवर्क opperation पहले शुरू होता है और धीमा चलता है (खराब नेटवर्क कनेक्टिविटी के कारण)। अन्य पृष्ठभूमि धागे ऐप को गैर जिम्मेदार बनाने में बहुत अधिक समय लेता है।ASyncTasks दूसरों को अवरुद्ध कर रहे हैं
चूंकि ASyncTasks दोनों स्वतंत्र हैं, इसलिए दूसरा इंतजार करने के लिए बहुत बेवकूफ है। यह अधिक तार्किक asynctasks अलग वर्गों के विभिन्न धागे का उपयोग होगा, क्या मैं गलत हूँ?
ASyncTask दस्तावेज़ पढ़ना। executeOnExecutor() का उपयोग करने के बारे में बात करते हैं, लेकिन मैं 11 से कम एपीआई स्तर में इसे कैसे हल कर सकता हूं?
यहाँ एक छोटा सा उदाहरण है कि "समस्या"
new Task1().execute();
new Task2().execute();
साथ
reproduces चला जाता है
public class Task1 extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
GLog.e("doInBackground start 1");
SystemClock.sleep(9000);
GLog.e("doInBackground end 1");
return null;
}
@Override
protected void onPreExecute() {
GLog.e("onPreExecute 1");
super.onPreExecute();
}
@Override
protected void onPostExecute(Void result) {
GLog.e("onPostExecute 1");
super.onPostExecute(result);
}
}
public class Task2 extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
GLog.e("onPreExecute 2");
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
GLog.e("doInBackground start 2");
SystemClock.sleep(9000);
GLog.e("doInBackground end 2");
return null;
}
@Override
protected void onPostExecute(Void result) {
GLog.e("onPostExecute 2");
super.onPostExecute(result);
}
}
यूआई को अपडेट करने के लिए आपके पास AsyncTask क्यों है? आपको आईआई थ्रेड पर सिंक्रनाइज़ करने की ज़रूरत है। क्या आपका UI AsyncTask पृष्ठभूमि थ्रेड पर कुछ और करता है? –
मैं इसका उपयोग समाचार के साथ एक सूचीदृश्य दिखाने के लिए उदाहरण के लिए करता हूं। OnPreExecute में मैं लोडिंग() UI दिखाता हूं, पृष्ठभूमि में इंटरनेट से समाचार पुनर्प्राप्त करता है और onPostExecute एडाप्टर को सूचीदृश्य में असाइन करता है। क्या यह दृष्टिकोण गलत है? – Addev
@Addev: आप पहले 'onPostExecute (...)' विधि में दूसरी 'AsyncTask' क्यों शुरू नहीं करते हैं? यदि आपको जो चाहिए वह यह है कि एक 'AsyncTask' दूसरे के परिणाम पर निर्भर करता है तो आपके पास प्रभावी रूप से एक तुल्यकालिक आवश्यकता होती है और आपको समानांतर में दो एसिंक्रोनस ऑपरेशंस नहीं चलाना चाहिए। – Squonk