猿问

同时运行多个AsyncTask-不可能?

同时运行多个AsyncTask-不可能?

我在试着同时运行两个AsyncTask。(平台是Android 1.5,HTC Hero。)但是,只有第一个被执行。这里有一个简单的片段来描述我的问题:

public class AndroidJunk extends Activity {
 class PrinterTask extends AsyncTask<String, Void, Void> {
     protected Void doInBackground(String ... x) {
      while (true) {
       System.out.println(x[0]);
       try {
        Thread.sleep(1000);
       } catch (InterruptedException ie) {
        ie.printStackTrace();
       }
      }
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        new PrinterTask().execute("bar bar bar");
        new PrinterTask().execute("foo foo foo");

        System.out.println("onCreate() is done.");
    }}

我期望的产出是:

onCreate() is done.bar bar bar
foo foo foo
bar bar bar
foo foo foo

诸若此类。然而,我得到的是:

onCreate() is done.bar bar bar
bar bar bar
bar bar bar

第二个AsyncTask从未得到执行。如果我更改了EXECUTE()语句的顺序,那么只有foo任务才会产生输出。

我是不是错过了一些显而易见的事情和/或做了些蠢事?难道不可能同时运行两个AsyncTask吗?

编辑:我意识到有问题的手机运行Android1.5,我更新了问题下降。因此。我在HTC Hero上运行Android2.1时没有这个问题。嗯.。


撒科打诨
浏览 643回答 3
3回答

至尊宝的传说

这允许在所有带有API 4+(Android1.6+)的Android版本上并行执行:@TargetApi(Build.VERSION_CODES.HONEYCOMB)&nbsp;//&nbsp;API&nbsp;11void&nbsp;startMyTask(AsyncTask&nbsp;asyncTask)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if(Build.VERSION.SDK_INT&nbsp;>=&nbsp;Build.VERSION_CODES.HONEYCOMB) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,&nbsp;params); &nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asyncTask.execute(params);}这是对Arhimed的出色回答的总结。请确保使用API级别11或更高的API作为项目构建目标。在Eclipse中,这是Project > Properties > Android > Project Build Target.&nbsp;这将不破坏向后兼容性以降低API级别。不要担心,如果您意外地使用了比minSdkVersion..如果您真的希望使用晚于minSdkVersion,您可以使用注释来抑制这些错误,但在这种情况下,您需要注意兼容性。你自己..这正是上面代码片段中发生的情况。

蛊毒传说

使@Sulai建议更具一般性:@TargetApi(Build.VERSION_CODES.HONEYCOMB)&nbsp;//&nbsp;API&nbsp;11public&nbsp;static&nbsp;<T>&nbsp;void&nbsp;executeAsyncTask(AsyncTask<T,&nbsp;?,&nbsp;?>&nbsp;asyncTask,&nbsp;T...&nbsp;params)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if(Build.VERSION.SDK_INT&nbsp;>=&nbsp;Build.VERSION_CODES.HONEYCOMB) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,&nbsp;params); &nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asyncTask.execute(params);}
随时随地看视频慕课网APP

相关分类

Android
我要回答