我正在尝试使用异步任务执行一些与线程并行的代码。 但由于某些原因,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");
为什么线程不起作用的任何想法?
答案 0 :(得分:3)
使用AsyncTask
可能无法为您提供所需的真正并行性。在不同版本的Android中,可同时运行的AsyncTask
的数量已从1更改为5,然后又更改为1(如果我没有错)。
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}}。