Android Generic AsyncTask类

And*_*ndi 2 java android android-asynctask

我已经看到了这个答案: 如何将OnPostExecute()的结果导入主活动,因为AsyncTask是一个单独的类?

但这不是我要问的,因为我的调用类有多个调用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我有另一个类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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

vip*_*tal 6

作为doInBackground背景的作品,同时从活动呼唤你不能在它的返回值得到的结果.

您需要设置一个将使用结果调用的回调.

例如:

interface Callback{
void onResult(String result);
}
Run Code Online (Sandbox Code Playgroud)

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

void onResult(String result){
    //Do something
}
Run Code Online (Sandbox Code Playgroud)

现在将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();
}
} 
Run Code Online (Sandbox Code Playgroud)

在从活动开始此任务时:

 new MyAsyncTask(new Callback{
void onResult(String result){ 
 //Do something
}
}).execute(url);
Run Code Online (Sandbox Code Playgroud)

因此,当你得到一个响应onResult将被调用