Android Generic AsyncTask类

时间:2014-07-16 06:23:32

标签: java android android-asynctask

我看到了这个答案: How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class?

但这不是我要问的,因为我的通话类有多次调用AsyncTask

我想创建一个通用的AsyncTask类,它将接受URL并从给定的URL下载内容并返回下载的内容。

示例:

public class MyAsyncTask extends AsyncTask<String, Void, String>{
    ProgressDialog dialog;

    protected void onPreExecute() {
        super.onPreExecute();
        dialog = ProgressDialog.show(context, "Loading", "Please wait...", true);
    }

    protected String doInBackground(String... params) {
        // do download here
    }

    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        dialog.dismiss();
    }
}

我还有另一个在不同情况下调用AsyncTask的课程

public class MyClass {

    public method1(String url) {
        String result = new MyAsyncTask().execute(url).get();
    }

    public method2(String url) {
        String result = new MyAsyncTask().execute(url).get();
    }
}

我知道使用get()方法会使整个过程成为同步任务。但是我想把结果带回调用类。我也知道,为了防止它,我必须实现一个接口。但是因为我在同一个班级有多个电话,所以不可能。所以有人能给我一个想法来解决这个问题吗?

5 个答案:

答案 0 :(得分:6)

doInBackground在后​​台工作时,您无法在从活动中调用时获得返回值的结果。

你需要设置一个回调函数,然后调用结果。

例如:

interface Callback{
void onResult(String result);
}

让您的活动在此活动中实施

void onResult(String result){
    //Do something
}

现在将asyncTask更改为:

public class MyAsyncTask extends AsyncTask<String, Void, String>{

   ProgressDialog dialog;
   Callback callback;
public MyAsyncTask(Callback callback){
 this.callback=callback;
}
protected void onPreExecute() {
    super.onPreExecute();
    dialog = ProgressDialog.show(context, "Loading", "Please wait...", true);
}

protected String doInBackground(String... params) {
    //do download here
}

protected void onPostExecute(String result) {
    super.onPostExecute(result);
    callback.onResult(result);
    dialog.dismiss();
}
} 

从活动开始此任务时:

 new MyAsyncTask(new Callback{
void onResult(String result){ 
 //Do something
}
}).execute(url);

因此,当您收到回复时,onResult会被调用

答案 1 :(得分:1)

为什么在同一个类中进行多次调用会破坏接口?

class Task extends AsyncTask{

    public interface TaskDoneListener{
        public void onDone(String result);
    }

    private TaskDoneListener listener;
    public Task(TaskDoneListener list){
        super();
        listener = list;
    }

    public void onPostExecute(String result){
        listener.onDone(result);
    }
}

答案 2 :(得分:0)

我建议您为此创建一个abstract类:

public abstract class AsyncDownloader extends AsyncTask<...> {
    doInBackground(Params...){
        return doNetworkDownload();
    }
    ABSTRACK onPostExecute(Result);// Notice there's no method body
}

然后在您的任何活动中,下载任务相同,但解析不同,请扩展此类:

public class MainActivityAsyncTask extends AsyncDownloader {
    //It will give you error, that you must implement the onPostExecute method at first
    @Override
    onPostExecute(Result){
        doUiStuff();
    }
}

答案 3 :(得分:0)

在您的班级中覆盖onPostExecute以将结果返回给您的班级。

MyAsyncTask mytask = new MyAsyncTask(){
    @Override
    protected void onPostExecute(String result) {
        //your code
    }
}
mytask.execute(url);

答案 4 :(得分:0)

您必须创建接口并在该接口中添加一个具有您想要从AsyncTask返回的参数类型的方法。

并在AsyncTask的构造函数中传递来自您活动的接口引用。并从onPostExecute()接口方法中设置数据。

因此,当从onPostExecute方法设置数据时,您将在活动类中被通知。

按照这个好的答案https://stackoverflow.com/a/9963705/942224