用于并行执行的AsyncTask相同

时间:2015-08-11 14:46:10

标签: android android-asynctask parallel-processing executor

我有一个AsyncTask作为公共类,如下所示,

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的结果?如果是,那怎么样?

2 个答案:

答案 0 :(得分:1)

使用线程池来实现此目的。

MedicalContactDto

ExecuteOnExecutor

因为我想你要问我怎么写这个(第二十次),这里有一个小例子。我省略了一些部分,因为它们不相关。这是您将id发送回活动以区分它们的方式。如果您需要在(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) 内执行不同的任务,那么只需使用switch / case语句。

onPostExecute

答案 1 :(得分:0)

使用自定义线程池。

为什么不在线程池中使用build(AsyncTask.THREAD_POOL_EXECUTOR)?它可以处理的任务限制很小。你如何判断池中的构建是否有效?它很简单,AsyncTask不会启动:)