У меня есть общий класс, говорят для, например, Класс A, который расширяется AsyncTask
и имеет все реализованные методы т.е. onPreExecute
, doinbackground
и onPostExecute
.
Теперь, существуют другие классы, которые хотят использовать объект Класса A.
Скажите, что Класс B использует класс A в ниже способа
A a = new A(context)
a.execute(url)
Затем я выбираю результат в, получают метод. Но доберитесь, метод не является надлежащим способом использовать AsyncTask. Мне понравится вкладывать результат 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;
}
}
'
Кто-то может сообщить мне, какова проблема может быть?
С уважением
Sunil
Чистым способом использования 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);
}
}
Таким образом, вам не нужно явно ждать завершения задачи, вместо этого ваш основной код (который, вероятно, является основным потоком UI), ждет в обычном цикле событий android, и метод onTaskComplete будет автоматически вызван, позволяя обработать результат задачи там.
Я бы сделал класс A частным классом, встроенным в родительский класс, и после завершения работы он должен обновить свойства родительского класса, что возможно в onPostExecute.