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

У меня есть общий класс, говорят для, например, Класс 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

38
задан willcodejavaforfood 20 July 2010 в 15:27
поделиться

2 ответа

Чистым способом использования 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 будет автоматически вызван, позволяя обработать результат задачи там.

136
ответ дан 27 November 2019 в 03:01
поделиться

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

1
ответ дан 27 November 2019 в 03:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: