दिलचस्प पोस्ट
मैं एंज्यूलर जेएस के साथ JSON फ़ीड से एक चयन ड्रॉपडाउन सूची को कैसे पॉप्यूलेट कर सकता हूं? आइकन पर Google क्रोम एक्सटेंशन नंबर जावा में फ़ाइलचैनल का उपयोग करते हुए स्मृति मैप से एक फ़ाइल को कैसे अनमाप करें? मैं एक बाइट सरणी को एक डबल और पीठ में कैसे रूपांतरित कर सकता / सकती हूं? मुझे पता है कि कॉलबैक फ़ंक्शन अतुल्यकालिक रूप से चलता है, लेकिन क्यों? एक स्थानांतरित पैटर्न के लिए एक स्ट्रिंग से बचें जावा में दूसरे धागे से स्विंगिंग GUI (स्विंग) 2 आयामी सरणी सूची क्रोम 48 और 49 में अक्षम-वेब-सुरक्षा * .h या * .hpp अपनी कक्षा परिभाषाओं के लिए जावास्क्रिप्ट का उपयोग करके मेरे ब्राउज़र संस्करण और ऑपरेटिंग सिस्टम का पता कैसे लगाया जा सकता है? सॉकेट.आईओ में कमरे बनाना Google कैलेंडर में जोड़ने के लिए लिंक जांचें कि कोई फ़ाइल पायथन में है या नहीं 'क्लास। फोर्मेम ("MY_JDBC_DRIVER")' का उद्देश्य क्या है?

AsyncTask एंड्रॉइड उदाहरण

मैं AsyncTask बारे में पढ़ रहा था, और मैंने नीचे दिए गए साधारण कार्यक्रम की कोशिश की। लेकिन यह काम करने के लिए प्रतीत नहीं होता मैं इसे कैसे कारगर बना सकता हूं?

 package com.test; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.provider.Settings.System; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.view.View.OnClickListener; public class AsyncTaskActivity extends Activity { Button btn; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn = (Button) findViewById(R.id.button1); btn.setOnClickListener((OnClickListener) this); } public void onClick(View view){ new LongOperation().execute(""); } private class LongOperation extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { for(int i=0;i<5;i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } TextView txt = (TextView) findViewById(R.id.output); txt.setText("Executed"); return null; } @Override protected void onPostExecute(String result) { } @Override protected void onPreExecute() { } @Override protected void onProgressUpdate(Void... values) { } } } 

मैं सिर्फ पृष्ठभूमि प्रक्रिया में 5 सेकंड के बाद लेबल बदलने की कोशिश कर रहा हूं।

यह मेरा मुख्य। Xml है :

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:indeterminate="false" android:max="10" android:padding="10dip"> </ProgressBar> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Start Progress" > </Button> <TextView android:id="@+id/output" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Replace"/> </LinearLayout> 

वेब के समाधान से एकत्रित समाधान "AsyncTask एंड्रॉइड उदाहरण"

ठीक है कि आप GUI को दूसरे थ्रेड के माध्यम से एक्सेस करने का प्रयास कर रहे हैं। यह मुख्य रूप से अच्छा अभ्यास नहीं है।

AsyncTask, अन्य धागा के अंदर doInBackground() में सब कुछ निष्पादित करता है, जिसमें GUI तक पहुंच नहीं होती है, जहां आपके विचार हैं

preExecute() और postExecute() इस नए धागे में भारी उठाने के पहले और बाद में आप जीयूआई तक पहुंच प्रदान करते हैं, तो आप प्रोसेसिंग के किसी भी परिणाम को दिखाने के लिए postExecute() करने के लिए लंबे आपरेशन के परिणाम भी पारित कर सकते हैं।

इन पंक्तियों को देखें जहां आप बाद में अपने TextView को अपडेट कर रहे हैं:

 TextView txt = (TextView) findViewById(R.id.output); txt.setText("Executed"); 

उन्हें PostExecute() में डाल PostExecute()

आप doInBackground पूरा होने के बाद अपडेट किए गए अपने doInBackground टेक्स्ट को doInBackground

संपादित करें: मैंने देखा कि आपका ऑनक्लिक श्रोता यह देखने के लिए नहीं देखता कि कौन सा दृश्य चुना गया है। मुझे ऐसा करने का सबसे आसान तरीका स्विच स्टेटमेंट के माध्यम से मिलता है भ्रम को बचाने के लिए सभी सुझावों के साथ मेरे पास एक पूर्ण वर्ग नीचे संपादित किया गया है।

 import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.provider.Settings.System; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.view.View.OnClickListener; public class AsyncTaskActivity extends Activity implements OnClickListener { Button btn; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn = (Button) findViewById(R.id.button1); // because we implement OnClickListener we only have to pass "this" // (much easier) btn.setOnClickListener(this); } public void onClick(View view) { // detect the view that was "clicked" switch (view.getId()) { case R.id.button1: new LongOperation().execute(""); break; } } private class LongOperation extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { for (int i = 0; i < 5; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.interrupted(); } } return "Executed"; } @Override protected void onPostExecute(String result) { TextView txt = (TextView) findViewById(R.id.output); txt.setText("Executed"); // txt.setText(result); // might want to change "executed" for the returned string passed // into onPostExecute() but that is upto you } @Override protected void onPreExecute() {} @Override protected void onProgressUpdate(Void... values) {} } } 

मेरा पूरा जवाब यहां है , लेकिन इस पृष्ठ पर अन्य उत्तरों को पूरक करने के लिए यहां एक व्याख्यात्मक छवि है। मेरे लिए, यह समझते हुए कि सभी चर क्या चल रहे थे, शुरुआत में सबसे भ्रामक हिस्सा था।

यहां छवि विवरण दर्ज करें

मुझे यकीन है कि यह ठीक से निष्पादित हो रहा है, लेकिन आप पृष्ठभूमि थ्रेड में UI तत्वों को बदलने का प्रयास कर रहे हैं और ऐसा नहीं होगा।

अपने कॉल और AsyncTask को निम्नानुसार संशोधित करें:

कॉलिंग क्लास

नोट: मैं निजी तौर पर onPostExecute() का उपयोग करने का सुझाव देता हूं जहाँ भी आप अपने AsyncTask थ्रेड को निष्पादित करते हैं और न कि कक्षा में जो AsyncTask को स्वयं विस्तारित करता है। मुझे लगता है कि यह कोड को आसानी से पढ़ना आसान बनाता है, खासकर अगर आपको कई जगहों में असिनका टास्क की ज़रूरत होती है जो परिणामों को थोड़ा अलग करती है।

 new LongThread() { @Override public void onPostExecute(String result) { TextView txt = (TextView) findViewById(R.id.output); txt.setText(result); } }.execute(""); 

लोंग ट्राइड क्लास (एसिंक टास्क फैली):

 @Override protected String doInBackground(String... params) { for(int i = 0; i < 5; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } return "Executed"; } 

अवधारणा और कोड यहाँ

एंड्रॉइड के AsyncTask का उपयोग करने के लिए मैंने एक सरल उदाहरण बनाया है यह onPreExecute(), doInBackground(), publishProgress() शुरू होता है onPreExecute(), doInBackground(), publishProgress() और अंत में onProgressUpdate()

इस doInBackground () में पृष्ठभूमि थ्रेड के रूप में काम करता है, जबकि UI थ्रेड में अन्य काम करता है। आप doInBackground () में एक UI तत्व तक नहीं पहुंच सकते अनुक्रम उसी जैसा है जैसा मैंने उल्लेख किया है

हालांकि अगर आप doInBackground से किसी भी विजेट को अपडेट करने की आवश्यकता है तो आप doInBackground कर सकते हैं publishProgress से doInBackground जो आपके UI विजेट को अपडेट करने के लिए onProgressUpdate अद्यतन पर कॉल करेगा।

 class TestAsync extends AsyncTask<Void, Integer, String> { String TAG = getClass().getSimpleName(); protected void onPreExecute (){ super.onPreExecute(); Log.d(TAG + " PreExceute","On pre Exceute......"); } protected String doInBackground(Void...arg0) { Log.d(TAG + " DoINBackGround","On doInBackground..."); for(int i=0; i<10; i++){ Integer in = new Integer(i); publishProgress(i); } return "You are at PostExecute"; } protected void onProgressUpdate(Integer...a){ super.onProgressUpdate(a); Log.d(TAG + " onProgressUpdate", "You are in progress update ... " + a[0]); } protected void onPostExecute(String result) { super.onPostExecute(result); Log.d(TAG + " onPostExecute", "" + result); } } 

इसे अपनी गतिविधि में इस तरह कॉल करें:

 new TestAsync().execute(); 

डेवलपर संदर्भ यहाँ

इन दो पंक्तियों को स्थानांतरित करें:

 TextView txt = (TextView) findViewById(R.id.output); txt.setText("Executed"); 

अपने AsyncTask के doInBackground विधि से बाहर और उन्हें onPostExecute विधि में डाल दिया आपके AsyncTask को ऐसा कुछ दिखना चाहिए:

 private class LongOperation extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { try { Thread.sleep(5000); // no need for a loop } catch (InterruptedException e) { Log.e("LongOperation", "Interrupted", e); return "Interrupted"; } return "Executed"; } @Override protected void onPostExecute(String result) { TextView txt = (TextView) findViewById(R.id.output); txt.setText(result); } } 

बस कुछ अतुल्यकालिक रूप से करने के लिए सबसे छोटा उदाहरण:

 class MyAsyncTask extends android.os.AsyncTask { @Override protected Object doInBackground(Object[] objects) { //do something asynchronously return null; } } 

इसे चलाने के लिए:

 (new MyAsyncTask()).execute(); 

जब एक अतुल्यकालिक कार्य निष्पादित होता है, तो कार्य 4 चरणों के माध्यम से चला जाता है:

  1. onPreExecute ()
  2. doInBackground (पैरामीटर …)
  3. onProgressUpdate (प्रगति …)
  4. onPostExecute (परिणाम)

नीचे एक डेमो उदाहरण है

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100)); // Escape early if cancel() is called if (isCancelled()) break; } return totalSize; } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); } } 

और एक बार आपने बनाया, एक कार्य बहुत सरल रूप से निष्पादित होता है:

  new DownloadFilesTask().execute(url1, url2, url3); 

उम्मीद है इससे आपको मदद मिलेगी…

जब आप कार्यकर्ता थ्रेड में हों, तो आप सीधे एंड्रॉइड पर UI तत्वों को हेरफेर नहीं कर सकते।

जब आप asyncTask का उपयोग कर रहे हैं तो कृपया कॉलबैक विधियों को समझें।

उदाहरण के लिए:

 public class MyAyncTask extends AsyncTask<Void, Void, Void>{ @Override protected void onPreExecute() { // Here you can show progress bar or something on the similar lines. // Since you are in a UI thread here. super.onPreExecute(); } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); // After completing execution of given task, control will return here. // Hence if you want to populate UI elements with fetched data, do it here. } @Override protected void onProgressUpdate(Void... values) { super.onProgressUpdate(values); // You can track you progress update here } @Override protected Void doInBackground(Void... params) { // Here you are in the worker thread and you are not allowed to access UI thread from here. // Here you can perform network operations or any heavy operations you want. return null; } } 

एफवाईआई: एक कार्यकर्ता थ्रेड से UI थ्रेड तक पहुंचने के लिए, आप या तो अपने दृश्य पर runOnUiThread () विधि या पोस्ट विधि का उपयोग कर सकते हैं।

उदाहरण के लिए:

 runOnUiThread(new Runnable() { textView.setText("something."); }); or yourview.post(new Runnable() { yourview.setText("something"); }); 

यह आपको चीजों को बेहतर ढंग से जानने में मदद करेगा इसलिए आपके मामले में, आपको अपने पाठ दृश्य को onPostExecute () विधि में सेट करना होगा।

मैं पृष्ठभूमि लाइब्रेरी के लिए इस लाइब्रेरी का उपयोग करके अपने जीवन को आसान बनाने की सलाह देता हूँ https://github.com/Arasthel/AynynJobLibrary

इसकी यह सरल ..

 AsyncJob.doInBackground(new AsyncJob.OnBackgroundJob() { @Override public void doOnBackground() { startRecording(); } }); 

POST अनुरोध के साथ नमूना Async कार्य:

 List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("key1", "value1")); params.add(new BasicNameValuePair("key1", "value2")); new WEBSERVICEREQUESTOR(URL, params).execute(); class WEBSERVICEREQUESTOR extends AsyncTask<String, Integer, String> { String URL; List<NameValuePair> parameters; private ProgressDialog pDialog; public WEBSERVICEREQUESTOR(String url, List<NameValuePair> params) { this.URL = url; this.parameters = params; } @Override protected void onPreExecute() { pDialog = new ProgressDialog(LoginActivity.this); pDialog.setMessage("Processing Request..."); pDialog.setIndeterminate(false); pDialog.setCancelable(false); pDialog.show(); super.onPreExecute(); } @Override protected String doInBackground(String... params) { try { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpEntity httpEntity = null; HttpResponse httpResponse = null; HttpPost httpPost = new HttpPost(URL); if (parameters != null) { httpPost.setEntity(new UrlEncodedFormEntity(parameters)); } httpResponse = httpClient.execute(httpPost); httpEntity = httpResponse.getEntity(); return EntityUtils.toString(httpEntity); } catch (Exception e) { } return ""; } @Override protected void onPostExecute(String result) { pDialog.dismiss(); try { } catch (Exception e) { } super.onPostExecute(result); } } 
  private class AsyncTaskDemo extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { super.onPreExecute(); // Showing progress dialog progressDialog = new ProgressDialog(this); progressDialog.setMessage("Loading..."); progressDialog.setCancelable(false); progressDialog.show(); } @Override protected Void doInBackground(Void... arg0) { //do code here return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); // Dismiss the progress dialog if (progressDialog.isShowing()) { progressDialog.dismiss(); } } @Override protected void onCancelled() { super.onCancelled(); progressDialog.dismiss(); Toast toast = Toast.makeText(getActivity(), "Error is occured due to some probelm", Toast.LENGTH_LONG); toast.setGravity(Gravity.TOP, 25, 400); toast.show(); } } 

सीधे शब्दों में:

 LongOperation MyTask = new LongOperation(); MyTask.execute(); 

आपको ऑनलिंकलिस्टर बटन को घोषित करने की आवश्यकता है, एक बार इसे डाउनलोड करने के लिए AsyncTask class DownloadJson पर क्लिक करें, प्रक्रिया नीचे दिखाई जाएगी:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn = (Button) findViewById(R.id.button1); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new DownloadJson().execute(); } }); } 

  // DownloadJSON AsyncTask private class DownloadJson extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected Void doInBackground(Void... params) { newlist = new ArrayList<HashMap<String, String>>(); json = jsonParser.makeHttpRequest(json, "POST"); try { newarray = new JSONArray(json); for (int i = 0; i < countdisplay; i++) { HashMap<String, String> eachnew = new HashMap<String, String>(); newobject = newarray.getJSONObject(i); eachnew.put("id", newobject.getString("ID")); eachnew.put("name", newobject.getString("Name")); newlist.add(eachnew); } } } catch (JSONException e) { Log.e("Error", e.getMessage()); e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void args) { newlisttemp.addAll(newlist); NewAdapterpager newadapterpager = new NewAdapterpager(ProcesssActivitypager.this,newlisttemp); newpager.setAdapter(newadapterpager); } } 

नीचे दिए गए अनुसार अपना कोड बदलें:

 @Override protected void onPostExecute(String result) { runOnUiThread(new Runnable() { public void run() { TextView txt = (TextView) findViewById(R.id.output); txt.setText("Executed"); } }); } 

सिद्धांत

यूआई थ्रेड के परिणामों को प्रकाशित करते समय AsyncTask आपको पृष्ठभूमि थ्रेड पर कोई कार्य चलाने की अनुमति देता है।

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

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

कार्यान्वयन

AsyncTask एक सामान्य वर्ग है (जिसका अर्थ है कि इसके कन्स्ट्रक्टर में पैरामीलेटेड प्रकार होते हैं। प्रत्येक जेनेरिक पैरामीटर को तीन चर के साथ जावा वैरिएबल तर्क के रूप में परिभाषित किया जाता है: ... और यह भी तकनीकी रूप से एक सरणी के रूप में पारित किया गया है)।

AsyncTask द्वारा उपयोग किए गए तीन प्रकार AsyncTask , Progress और Result :

  1. पैराम – पैरामीटर प्रकार कार्य निष्पादन पर भेजा गया
  2. प्रगति – पृष्ठभूमि गणना के दौरान प्रगति को अद्यतन करने के लिए प्रकाशित किया गया प्रकार
  3. परिणाम – पृष्ठभूमि गणना के परिणाम का प्रकार

ये तीन पैरामीटर तीन प्राथमिक कार्यों से मेल खाती हैं जो आप AsyncTask में ओवरराइड कर सकते हैं:

  • doInBackground()
  • onProgressUpdate()
  • onPostExecute()

    भी:

  • onPreExecute()

AsyncTask निष्पादित करने के लिए

पृष्ठभूमि कार्य को भेजे जाने वाले पैरामीटर के साथ कॉल करें।

क्या होता है

  1. मुख्य / UI थ्रेड पर, onPreExecute पर कॉल किया जाता है। (इस धागा में कुछ शुरू करने के लिए।)
  2. पृष्ठभूमि थ्रेड पर, doInBackground() को doInBackground() फ़ंक्शन के लिए पारित पैरामीटर के साथ कहा जाता है।
    • doInBackground() का उपयोग करने के लिए कम से कम doInBackground() को ओवरराइड करना होगा
    • जहां लंबे समय से चलने वाला कार्य होना चाहिए
    • लंबे समय से चलने वाले कार्य की प्रगति के साथ कुछ यूआई को अपडेट करने के लिए Progress पैरामीटर के साथ publishProgress() को कॉल करें। onProgressUpdate() पर कॉल करने के लिए इसका कारण
  3. पृष्ठभूमि थ्रेड पर, परिणाम को doInBackground() में कार्य से वापस किया जाता है, जो कारण बनता है
  4. मुख्य / UI थ्रेड पर, onPostExecute() को लौटा परिणाम के साथ बुलाया जाना है

उदाहरण

वेब से कुछ डाउनलोड करने के लिए ब्लॉकिंग कार्य का उदाहरण फिर से उपयोग करना, निम्न उदाहरण एक छवि को डाउनलोड करता है और उसे एक छवि दृश्य में प्रदर्शित करता है। doInBackground() विधि छवि को डाउनलोड करती है और इसे किसी ऑब्जेक्ट प्रकार doInBackground() संग्रहीत करता है। onPostExecute() विधि बिटमैप लेता है और इसे छवि onPostExecute() रखता है।

 class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { ImageView bitImage; public DownloadImageTask(ImageView bitImage) { this.bitImage = bitImage; } protected Bitmap doInBackground(String... urls) { String urldisplay = urls[0]; Bitmap mBmp = null; try { InputStream in = new java.net.URL(urldisplay).openStream(); mBmp = BitmapFactory.decodeStream(in); } catch (Exception e) { Log.e("Error", e.getMessage()); e.printStackTrace(); } return mBmp; } protected void onPostExecute(Bitmap result) { bitImage.setImageBitmap(result); } }