android 4.2.2中的AsyncTask

时间:2013-07-23 02:10:07

标签: java android

我正在尝试使用异步任务执行一些与线程并行的代码。 但由于某些原因,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"); 

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

2 个答案:

答案 0 :(得分:3)

使用AsyncTask可能无法为您提供所需的真正并行性。在不同版本的Android中,可同时运行的AsyncTask的数量已从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

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

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

答案 1 :(得分:3)

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

查看您提供的输出,SendTask和&amp; DownloaderTask 2.3.3并行执行4.2.2&gt; DONUT和&lt;蜂窝。但是,在DownloaderTask的情况下,会发生AsyncTasks的串行执行。由于execute(Params... params)首先执行,SendTask等待它完成执行(由于while(true)而不会发生) - &gt;因此,没有输出。

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