并行执行的相同 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)
既然我觉得你要问我怎么写这个(第二十次),这里有一个小例子。我省略了一些部分,因为它们不相关。这就是您将 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 不会启动 :)
我有一个 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)
既然我觉得你要问我怎么写这个(第二十次),这里有一个小例子。我省略了一些部分,因为它们不相关。这就是您将 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 不会启动 :)