繁体   English   中英

AsyncTask不能与第二个AsyncTask同时运行

[英]AsyncTask doesn't run simultaneously with second AsyncTask

我有一个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();

我期望输出:

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

但是我得到了

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

这意味着AsyncTask不会同时执行。 为什么是这样? 我以为穿线的重点是这不会发生吗? +有没有一种方法可以使它们同时运行而无需更改太多代码?

根据执行顺序下的AsyncTask文档

HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误。 如果您确实想要并行执行,则可以使用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor, Object[])

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

executeOnExecutorTHREAD_POOL_EXECUTOR一起THREAD_POOL_EXECUTOR

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

您可以构造类似

if (Build.Version.SDK_INT >= 11){
    myAsyncTask.executeOnExecutor(...);
}else{
    myAsyncTask.execute(...);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM