जब तक एसिंक्स टास्क खत्म हो जाता है तब तक उसका काम खत्म हो जाता है


85

मैं प्रोग्रामिंग में बहुत नया हूँ और मुझे कुछ संदेह है।

मैं एक है AsyncTaskजो मैं के रूप में कहते हैं RunInBackGround।

और मैं इस प्रक्रिया को शुरू करता हूं:

new RunInBackGround().execute();

लेकिन मैं इस कॉल को तब तक इंतजार करना चाहता हूं, जब तक कि कोड के अन्य स्टेटमेंट पर आगे बढ़ने से पहले यह कॉल खत्म न हो जाए।

मैं उसे कैसे कर सकता हूँ?

क्या इसके लिए कोई रास्ता है?


2
AsyncTask की बात यह है कि यह एसिंक्रोनस है, जिसका अर्थ है कि यह बाकी कोड के साथ सिंक्रनाइज़ नहीं है।
— ग्जॉर्डिस

3
अपनी कक्षा में कॉलबैक प्राप्त करने के लिए आप AsyncTask पद्धति के onPostExecute () का उपयोग कर सकते हैं।
— DcodeChef

5
आप वास्तव में इसे समाप्त होने तक इंतजार नहीं करना चाहते हैं। जब आप यह जानना चाहते हैं कि यह कब खत्म होगा।
— njzk2

3
@DcodeChef केवल वही है जो समझ गया था कि वह प्रश्न में क्या चाहता है।
— कृपया_डॉट_बुल्ली_मे_ओस_लॉवर्स

1
मुझे लगता है कि यह जवाब है कि आप stackoverflow.com/questions/13079645/… के
— user3362415

जवाबों:


130

इस कॉल के पूरा होने तक प्रतीक्षा करें

आपको परिणाम वापस पाने के लिए AsyncTask.get () विधि को कॉल करना होगा और doInBackgroundनिष्पादन पूरा होने तक प्रतीक्षा करें । लेकिन यह मुख्य यूआई धागा यदि आप कॉल एक धागा अंदर विधि नहीं मिल फ्रीज होगा ।

UI थ्रेड प्रारंभ में परिणाम वापस पाने के लिए इस AsyncTaskप्रकार है:

String str_result= new RunInBackGround().execute().get();

3
तो परिणाम के लिए प्रतीक्षा करें और मुख्य UI थ्रेड को लॉक न करें! कोड परिणाम के लिए इंतजार कर रहा है, लेकिन इस समय के दौरान, प्रगति पट्टी लुढ़कती रहती है!
— मुहम्मद नादेरी

2
@MuhammadNaderi: AsyncTaskबिना getविधि के और AsyncTask onPostExecuteपद्धति का उपयोग करना कहा जाता है जो मुख्य UI थ्रेड पर यू परिणाम प्रदान करते हैं
— ρя --ρρя K

3
सुनिश्चित करें कि यह एक वर्कअराउंड है, जिसे मैं अभी कुछ समय से उपयोग कर रहा हूं, लेकिन कभी-कभी मुझे कोड की आवश्यकता होती है कि वह एसिंक्टस्क के लिए इंतजार करे, जैसे कुछ awaitहो c#, और मुख्य थ्रेड को लॉक न किया जाए
— मुहम्मद नादेरी

2
@ ρя aρєяK धन्यवाद, एक लाख धन्यवाद। आपको इस बात का कोई अंदाजा नहीं है कि मैंने केवल एक .get () के साथ इस समस्या पर बाल खींचे हैं। यह हल हो गया (आप मुझसे मजाक कर रहे हैं) केवल एक .get () !!!!!
— कोड_वर्म

यूआई को ठंड से बचने के लिए आप एसिंक्कटस्क का उपयोग कैसे कर सकते हैं और प्राप्त करने () का उपयोग करने से बच सकते हैं?
— अर्जुन इस्सर

36

हालाँकि, यह बेहतर होगा कि यदि आपका कोड समानांतर चल सकता है, तो ऐसा हो सकता है कि आप केवल एक थ्रेड का उपयोग कर रहे हैं ताकि आप UI थ्रेड को ब्लॉक न करें, भले ही आपके ऐप के उपयोग प्रवाह को इसके लिए इंतजार करना पड़े।

आपको यहां बहुत अधिक 2 विकल्प मिले हैं;

  1. आप जिस कोड की प्रतीक्षा कर रहे हैं, उसे आप AsyncTask में निष्पादित कर सकते हैं। यदि इसे UI (थ्रेड) को अपडेट करने के साथ करना है, तो आप onPostExecute पद्धति का उपयोग कर सकते हैं। जब आपका बैकग्राउंड काम हो जाता है तो यह अपने आप कॉल हो जाता है।

  2. यदि आप किसी कारण से इसे गतिविधि / फ्रैगमेंट / जो कुछ भी करने के लिए मजबूर हैं, तो आप केवल अपने आप को एक कस्टम श्रोता बना सकते हैं, जिसे आप अपने AsyncTask से प्रसारित करते हैं। इसका उपयोग करके, आप अपनी गतिविधि / फ़्रैगमेंट / जो कुछ भी केवल तभी कॉल कर सकते हैं, जब आप इसे चाहते हैं: aka जब आपका AsyncTask किया जाता है, जिसके लिए आपको प्रतीक्षा करनी थी।


6
यह एक भयानक जवाब है, इसे स्वीकार किया जाना चाहिए। यहाँ यह भी एक नमूना है कि कैसे इसे AsyncTasks के साथ प्राप्त किया जा सकता है: stackoverflow.com/questions/12575068/…
— जोस गोंजालेज

अपने दूसरे विकल्प में, जब आप अपने रिसीवर के लिए इरादा फेंक देते हैं, तो मुख्य धागे को फिर से शुरू किया जाएगा। ओपी को इसकी जरूरत नहीं है।
— लिनसी टोनिटा

16

अपने AsyncTaskऐड में एक ProgressDialog पसंद करें:

private final ProgressDialog dialog = new ProgressDialog(YourActivity.this);

आप सेट कर सकते हैं onPreExecute()विधि की तरह:

this.dialog.setMessage("Processing..."); 
this.dialog.show();

और अपनी onPostExecute(Void result)विधि में अपने को खारिज ProgressDialog।


15

AsyncTask के चार तरीके हैं ।।

onPreExecute  -- for doing something before calling background task in Async

doInBackground  -- operation/Task to do in Background

onProgressUpdate  -- it is for progress Update

onPostExecute  -- this method calls after asyncTask return from doInBackground.

आप अपने काम को onPostExecute()उस पर कॉल कर सकते हैं, जहां से लौटने के बादdoInBackground()

onPostExecute वह है जिसे आपको कार्यान्वित करने की आवश्यकता है।


1

मुझे लगता है कि सबसे आसान तरीका है कि आप डेटा को onpostexecute से प्राप्त करें और इंटरफ़ेस से Ui को चलाएं:

एक इंटरफ़ेस बनाएँ:

public interface AsyncResponse {
    void processFinish(String output);
}

फिर एसिंक्टस्क में

@Override
protected void onPostExecute(String data) {
    delegate.processFinish(data);
}

फिर yout मुख्य गतिविधि में

@Override
public void processFinish(String data) {
     // do things

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.