并行执行的相同 AsyncTask

Same AsyncTask for Parallel execution

我有一个 AsyncTask 作为 public class 如下所示,

public class FetchFromTCWebTask extends AsyncTask<String, Void, String> {
MainActivity mainActivity;
int requestId;
private final static String DEBUG_TAG = "FetchFromTCWebTask";

FetchFromTCWebTask(MainActivity activity, int id) {
    mainActivity = activity;
    requestId = id;
}

@Override
protected String doInBackground(String[] urls) {
    // params comes from the execute() call: params[0] is the url.
    try {
        return downloadUrl(urls[0]);
    } catch (IOException e) {
        return "Unable to retrieve web page. URL may be invalid.";
    }
}

@Override
protected void onPostExecute(String result) {
    mainActivity.loadFinished(result);
}
// Reads an InputStream and converts it to a String.
public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException {
    Reader reader = null;
    reader = new InputStreamReader(stream, "UTF-8");
    char[] buffer = new char[len];
    reader.read(buffer);
    return new String(buffer);
}

public interface UIListner {
    public void loadFinished(String result);

    public void loading(int progress);
}

}

现在我想把它叫做

(new FetchFromTCWebTask(actviity,1)).execute(url);
(new FetchFromTCWebTask(actviity,2)).execute(url);
(new FetchFromTCWebTask(actviity,3)).execute(url);

现在我的问题是,有什么方法可以并行处理并分别取回 1,2 和 3 的结果?如果是那么怎么办?

使用线程池来实现。

(new FetchFromTCWebTask(actviity, 1)).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, url)
(new FetchFromTCWebTask(actviity, 2)).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, url)
(new FetchFromTCWebTask(actviity, 3)).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, url)

ExecuteOnExecutor


既然我觉得你要问我怎么写这个(第二十次),这里有一个小例子。我省略了一些部分,因为它们不相关。这就是您将 id 发送回 activity 以区分它们的方式。如果您需要在 onPostExecute 中执行不同的任务,那么只需使用 switch/case 语句即可。

public class FetchFromTCWebTask extends AsyncTask<String, Void, String>
{
    MainActivity mainActivity;
    int requestId;

    FetchFromTCWebTask(MainActivity activity, int id)
    {
        mainActivity = activity;
        requestId = id;
    }

    ...

    @Override
    protected void onPostExecute(String result)
    {
        mainActivity.loadFinished(result, requestId);
    }

    public interface UIListner
    {
        public void loadFinished(String result, int id);
        public void loading(int progress);
    }
}

使用自定义线程池。

为什么不使用内置线程池(AsyncTask.THREAD_POOL_EXECUTOR)?它可以处理的任务限制很小。你怎么知道内置池没有工作?很简单,AsyncTask 不会启动 :)