Общий класс для AsyncTask в Android?

У меня есть общий класс, например, для класса A, который расширяет AsyncTask и имеет все реализованные методы, т.е. onPreExecute , doinbackground и onPostExecute .

Теперь есть другие классы, которые хотят использовать объект класса А.

Скажем, класс B использует класс A следующим образом

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

Затем я получаю результат в методе get. Но метод get не подходит для использования AsyncTask. Я хочу получить результат в onPostExecute . Для этого я попытался использовать логический параметр, который будет onpostexecute только в onpostexecute . Класс B будет проверять до тех пор, пока он не станет истинным, и когда он вернется, он получит результат.

Но это как-то блокирует приложение.

Я разместил код для 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; } } 

'

Может ли кто-нибудь сообщить мне, в чем проблема?

С уважением

Сунил

Чистым способом использования AsyncTask для получения результата будет использование интерфейса обратного вызова.

Вот простой пример этой концепции:

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

Затем в вашем классе B:

 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); } } 

Теперь вы должны добавить следующий код в свой класс A:

 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); } } 

Таким образом, вам не нужно явно ждать завершения вашей задачи, вместо этого ваш основной код (который, вероятно, является основным потоком пользовательского интерфейса), ждет в обычном цикле событий 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(); } 

Я бы сделал класс A частным классом, встроенным в родительский класс, и как только это будет сделано с работой, он должен обновить свойства родительского класса, это возможно onPostExecute.