1

我正在尝试使用异步任务与线程并行执行一些代码。但由于某种原因,在 android 4.2.2 中不起作用。

我有这个代码在主类中:

new XmlDownloader();

task=new SendTask().execute("");

和以下课程:

 private class SendTask extends AsyncTask<String,String,String>{



        @Override
        protected void onPreExecute(){

        }

        @Override
        protected String doInBackground(String...strings){

               while(true){                               

                    Log.w("outside", "hello");  
             }            
          }

            return strings[0];
        }

        @Override
        protected void onPostExecute(String country){


        }
     }

    public class XmlDownloader extends Activity {


public XmlDownloader(int pos) {


    DownloaderTask task = new DownloaderTask();

    task.execute("");
}


private String downloadXml(String s,int pos1) {

    return null;
}


private class DownloaderTask extends AsyncTask<String, Void, String> {

    public DownloaderTask() {

    }

    @Override
    // Actual download method, run in the task thread
    protected String doInBackground(String... params) {

         while(true){
             Log.w("down", "asdasdasssasdasdasdasd");   
             if(isCancelled())
                 return null;
         };


         return null;

    }

    @Override
    // Once the image is downloaded, associates it to the imageView
    protected void onPostExecute(String bitmap) {


    }
}
 }

在 android 2.3.3 中,logcat 显示了这个序列

 Log.w("down", "asdasdasssasdasdasdasd");   
 Log.w("down", "asdasdasssasdasdasdasd");   
 Log.w("down", "asdasdasssasdasdasdasd");       
 Log.w("outside", "hello");
 Log.w("outside", "hello");
 Log.w("down", "asdasdasssasdasdasdasd");   

但在 android 4.2.2 中只显示

   Log.w("down", "asdasdasssasdasdasdasd"); 
   Log.w("down", "asdasdasssasdasdasdasd"); 
   Log.w("down", "asdasdasssasdasdasdasd"); 
   Log.w("down", "asdasdasssasdasdasdasd"); 
   Log.w("down", "asdasdasssasdasdasdasd"); 

任何想法为什么线程不起作用?

4

2 回答 2

3

使用AsyncTask可能无法为您提供所需的真正并行性。在不同版本的 Android 中AsyncTask,可以同时运行的 s 数量已经从 1 变为 5,然后又变回 1(如果我没记错的话)。

https://github.com/android/platform_frameworks_base/commits/master/core/java/android/os/AsyncTask.java

https://groups.google.com/forum/?fromgroups#!topic/android-developers/8M0RTFfO7-M

AsyncTasks 由ThreadPool您无法控制的 a 支持。如果AsyncTask不符合您的需求,是使用服务Loopers或构建您自己的ThreadPoolExecutor. AsyncTask 并非设计为无限循环,即作为服务器或服务。

所以发生的事情是,在您的 Android 版本中,只有池中的第一个排队线程被执行,并且由于它不会终止(它们将按顺序运行),第二个永远不会启动。

于 2013-07-23T02:16:31.110 回答
3

这与 AsyncTasks 自 API 3 中的概念以来的发展方式有关。在API 3中,AsyncTasks(复数)是串行执行的。这已更改为线程池,允许多个 AsyncTask 并行运行(API 4(DONUT))。但是,开始HONEYCOMB(API 11)时,AsyncTasks 又回到了串行执行的状态。

查看您提供的输出,如果是 > DONUT 和 < HONEYCOMB ,则SendTask&DownloaderTask并行执行。2.3.3但是,在 的情况下4.2.2,会发生 AsyncTasks 的串行执行。由于DownloaderTask首先执行,SendTask 等待它完成执行(由于 while(true) 而不会发生)-> 因此,没有输出。

从 API 11 开始,您可以选择 AsyncTask 是串行运行还是并行运行。对于串行执行,使用execute(Params... params). 对于并行执行,请查看executeOnExecutor(Executor exec, Params... params).

于 2013-07-23T02:30:42.057 回答