为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

撒科打诨 2019-06-05 13:20:13
同时运行多个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时没有这个问题。嗯.。
查看完整描述

3 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

这允许在所有带有API 4+(Android1.6+)的Android版本上并行执行:

@TargetApi(Build.VERSION_CODES.HONEYCOMB) // API 11void startMyTask(AsyncTask asyncTask) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
        asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
    else
        asyncTask.execute(params);}

这是对Arhimed的出色回答的总结。

请确保使用API级别11或更高的API作为项目构建目标。在Eclipse中,这是Project > Properties > Android > Project Build Target这将破坏向后兼容性以降低API级别。不要担心,如果您意外地使用了比minSdkVersion..如果您真的希望使用晚于minSdkVersion,您可以使用注释来抑制这些错误,但在这种情况下,您需要注意兼容性。你自己..这正是上面代码片段中发生的情况。


查看完整回答
反对 回复 2019-06-05
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

使@Sulai建议更具一般性:

@TargetApi(Build.VERSION_CODES.HONEYCOMB) // API 11public static <T> void executeAsyncTask(AsyncTask<T, ?, ?> asyncTask, T... params) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
        asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
    else
        asyncTask.execute(params);}


查看完整回答
反对 回复 2019-06-05
  • 3 回答
  • 0 关注
  • 642 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信