Java Android通用异步任务类

Java Android通用异步任务类,java,android,android-asynctask,Java,Android,Android Asynctask,我看到了这个答案: 但这不是我要问的,因为我的调用类有多个对AsyncTask的调用 我想创建一个通用的AsyncTask类,它将接受URL并从给定的URL下载内容,然后返回下载的内容 例如: public class MyAsyncTask extends AsyncTask<String, Void, String>{ ProgressDialog dialog; protected void onPreExecute() { super.on

我看到了这个答案:

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

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

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

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

由于
doInBackground
在后台工作,因此从活动调用时,无法在其返回值中获得结果

您需要设置一个回调函数,该函数将随结果一起被调用

例如:

interface Callback{
void onResult(String result);
}
让您的活动在活动中实现此目标

void onResult(String result){
    //Do something
}
现在将您的异步任务更改为:

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

因此,当您收到响应时,
onResult
将被调用

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

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

在类中重写
onPostExecute
,将结果返回到类中

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

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

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

所以当从onPostExecute方法设置数据时,将在activity类中通知您


按照这个漂亮的答案进行操作

使用处理程序对主活动进行IPC,并使用处理程序向主活动发送消息。您是否尝试使用同一Asyn任务背靠背执行多个请求?请看一个完美的工作示例,但我的活动对异步任务有多个调用。因此,我的onResult()方法将在不同的情况下被激发。如何解决这个问题?一种方法是为每个异步任务调用提供不同的回调。检查我的编辑。这没关系,但如果操作耗时太长,可能无法在
onTaskCompleted
中获得结果,该问题已经记录在案,但我们可以通过自定义事件来解决。AsyncTask克服的一个实现是
AsyncTaskLoader
及其子类
Cursorloader
。请注意
AsyncTask
的一般实现,即我必须开发一个应用程序,该应用程序使用来自服务器的数据填充ListView,直到我开发了自己的自定义事件后才填充该应用程序。@Gödel77 thanx供建议。。我可以得到任何简短的文档链接吗?我这里没有代码,对于这种情况,我的意思是,只需使用适当的侦听器开发您自己的事件类型。此侦听器应该侦听来自服务器的列表是否为空(当列表不为空时,我们将触发事件!),然后我们可以使用该列表填充适配器。您知道,
CustomAdapter-ourAdapter=newcustomadapter(…,list)
listView.setAdapter(ourAdapter)
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();
    }
}
MyAsyncTask mytask = new MyAsyncTask(){
    @Override
    protected void onPostExecute(String result) {
        //your code
    }
}
mytask.execute(url);