दिलचस्प पोस्ट
आर में अपवाद हैंडलिंग सभी छवियों को दिखाने के लिए JLbel के साथ जेएलैबल को जोड़ें यूआरएल बदलें और jQuery का उपयोग कर रीडायरेक्ट करें क्या करता है (फ़ंक्शन ($) {}) (jQuery); क्या मतलब है? मैं एक HTML तत्व की वास्तविक चौड़ाई और ऊंचाई कैसे प्राप्त करूं? आईओएस रन कोड एक बार एक दिन NumPy: हटाए गए एनएएन के साथ औसत गणना डेक्स मर्ज करने में असमर्थ Google एपीआई एपीआई अनुरोध एंड्रॉइड ऑटो-कॉम्पले के लिए निषेध है, यहां तक ​​कि सही एपीआई कुंजी के साथ भी JS / jQuery में एक कुंजीपेज / कुंजीडाउन / कीप इवेंट ट्रिगर करें? रूबी ब्लॉक और अप्रतिबंधित तर्क उच्चतम / सबसे छोटी <जो> प्रति समूह के साथ रिकॉर्ड प्राप्त करें एंड्रॉइड – मैं एक एएनआर की जांच कैसे करूं? PHP दिनांक () प्रारूप जब MySQL में datetime में डालने Html विशेष वर्ण कैसे निकालें?

Android में AsyncTask के लिए सामान्य वर्ग?

मेरे पास एक सामान्य वर्ग है, उदाहरण के लिए क्लास ए, जो AsyncTask और सभी तरीकों को लागू किया है अर्थात् onPreExecute , doinbackground और onPostExecute

अब, वहाँ अन्य वर्ग हैं जो कक्षा ए ऑब्जेक्ट का उपयोग करना चाहते हैं।

कहो कक्षा बी कक्षा ए को नीचे तरीके से उपयोग करता है

 A a = new A(context) a.execute(url) 

फिर मैं परिणाम प्राप्त करने में विधि लाने। लेकिन विधि प्राप्त करें AsyncTask का उपयोग करने का उचित तरीका नहीं है मैं परिणाम पर onPostExecute प्राप्त करना onPostExecute इसके लिए मैंने एक बूलीयन पैरामीटर का उपयोग करने की कोशिश की जो केवल onpostexecute में ही सच्चाई होगी। कक्षा बी यह तब तक जांच करेगा जब तक कि यह सही न हो जाए और जब यह सच हो जाए तो यह परिणाम प्राप्त करेगा।

लेकिन यह किसी भी तरह आवेदन को अवरुद्ध कर रहा है।

मैंने नीचे asynctask के लिए कोड रखा है।

'

 import java.io.IOException; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.ResponseHandler; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.BasicResponseHandler; import org.apache.http.impl.client.DefaultHttpClient; import android.app.ProgressDialog; import android.content.Context; import android.os.AsyncTask; public class A extends AsyncTask<String, Void, String> { private Context context = null; private final HttpClient httpClient = new DefaultHttpClient(); private String content = null; //private String error = null; private String finalResult = null; private static boolean isResult = false; private ProgressDialog progressDialog = null; public BabbleVilleSyncTask(Context context) { this.context = context; progressDialog = new ProgressDialog(this.context); } protected void onPreExecute() { progressDialog.setMessage("Please Wait...."); progressDialog.show(); } protected String doInBackground(String... urls) { try { //urls[0] = URLEncoder.encode(urls[0], "UTF-8"); HttpGet httpget = new HttpGet(urls[0]); ResponseHandler<String> responseHandler = new BasicResponseHandler(); content = httpClient.execute(httpget, responseHandler); } /*catch(UnsupportedEncodingException ue) { error = ue.getMessage(); }*/ catch (ClientProtocolException e) { //error = e.getMessage(); cancel(true); } catch (IOException e) { //error = e.getMessage(); cancel(true); } httpClient.getConnectionManager().shutdown(); return content; } protected void onPostExecute(String result) { finalResult = result; progressDialog.dismiss(); System.out.println("on Post execute called"); isResult = true; } public boolean getIsResult() { return isResult; } public void setIsResult(boolean flag) { isResult = flag; } public String getResult() { return finalResult; } } 

'

क्या कोई मुझे बता सकता है कि समस्या क्या हो सकती है?

सादर

सुनील

वेब के समाधान से एकत्रित समाधान "Android में AsyncTask के लिए सामान्य वर्ग?"

परिणाम प्राप्त करने के लिए AsyncTask का उपयोग करने का एक साफ तरीका कॉलबैक इंटरफ़ेस का उपयोग करना होगा।

यहां इस अवधारणा का एक सरल उदाहरण है:

 interface AsyncTaskCompleteListener<T> { public void onTaskComplete(T result); } 

फिर अपने बी वर्ग में:

 class B implements AsyncTaskCompleteListener<String> { public void onTaskComplete(String result) { // do whatever you need } public void launchTask(String url) { A a = new A(context, this); a.execute(url); } } 

आपको अब अपने ए कक्षा में निम्न कोड जोड़ना चाहिए:

 class A extends AsyncTask<String, Void, String> { private AsyncTaskCompleteListener<String> callback; public A(Context context, AsyncTaskCompleteListener<String> cb) { this.context = context; this.callback = cb; } protected void onPostExecute(String result) { finalResult = result; progressDialog.dismiss(); System.out.println("on Post execute called"); callback.onTaskComplete(result); } } 

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

 public abstract class BaseTask<T> extends AsyncTask<Object, Void, T> { public Context context; public ProgressDialog dialog; public Exception exception; protected BaseTask() { } public BaseTask(Context context) { this.context = context; this.dialog = new ProgressDialog(context); } @Override protected void onPreExecute() { this.dialog.setMessage(context.getResources().getString(R.string.loading)); this.dialog.show(); } @Override protected T doInBackground(Object... objects) { try { return doWork(objects); } catch (Exception e) { exception = e; } return null; } @Override protected void onPostExecute(T result) { if (dialog.isShowing()) dialog.dismiss(); if (exception == null) { onResult(result); } else { onError(); } } public abstract T doWork(Object... objects) throws Exception; public abstract void onResult(T result); public abstract void onError(); } 

मैं कक्षा ए को एक निजी वर्ग को अभिभावक वर्ग में एम्बेडेड कर दूंगा, और एक बार काम के साथ किया जाना चाहिए, इसे मूल वर्ग गुणों को अपडेट करना चाहिए, यह संभव है PostExecute