1

我有一个 AsyncTask

private class LoadData extends AsyncTask<String, Void, String> {
    private String WEBURL;
    LoadData(String url){
        this.WEBURL=url;
    }
    protected String doInBackground(String... params) {
        System.out.println("Downloading");
        URL url = new URL(WEBURL);
        URLConnection conn = url.openConnection();
        conn.connect();
        byte buffer[] = new byte[1024];
        InputStream in = new BufferedInputStream(url.openStream());
        String contents="";
        while((count = in.read(buffer))!=-1){
        total+=count;
        contents += new String(buffer, 0, count);
        }
        System.out.println("Downloaded");
        in.close;
    }
}

如果我尝试LoadData通过调用来制作两个

new LoadData("http://www.google.com").execute();
new LoadData("http://www.stackoverflow.com").execute();

我希望输出:

正在下载 正在下载 已下载 已下载

但相反我得到

下载 下载 下载 下载

这意味着AsyncTasks 没有同时执行。为什么是这样?我认为线程的重点是这不会发生?+ 有没有办法让它们同时运行而无需更改太多代码?

4

2 回答 2

5

根据Order of Execution下的AsyncTask 文档

从 开始HONEYCOMB,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误。如果你真的想要并行执行,你可以调用executeOnExecutor(java.util.concurrent.Executor, Object[])with THREAD_POOL_EXECUTOR

IE,new LoadData("http://www.google.com").executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

于 2013-09-02T21:50:07.110 回答
1

executeOnExecutor与 一起使用THREAD_POOL_EXECUTOR

从 API 11 开始,AsyncTask默认情况下 s 不会并行运行。您需要executeOnExecutor使用给定的参数调用以确保 AsyncTasks 并行运行。

你可以构建类似的东西

if (Build.Version.SDK_INT >= 11){
    myAsyncTask.executeOnExecutor(...);
}else{
    myAsyncTask.execute(...);
}
于 2013-09-02T21:50:00.253 回答