异步任务..无法调用executeOnExecutor()方法

5

我在我的安卓应用程序中运行了一些异步任务,但遇到了一些问题。由于我正在使用某些网络IO,有时会比预期的时间长并阻塞其他正在运行的异步任务。

我需要保持目标和最小SDK版本不变,但它们的目标SDK版本是"15",最小SDK版本是"8"。当调用异步任务时,我需要检查设备的SDK版本,如果大于11,则可以调用executeOnExecutor()而不是仅执行execute,以允许设备并行运行这些任务并防止阻塞操作。

尽管我的目标SDK为15,但我使用的设备具有17的SDK。

但是,在调用时:

MyAsyncTask(this).executeOnExecutor();

我遇到了一个错误 "The method executeOnExecutor() is undefined for the type",唯一可用的选项是:

MyAsyncTask(this).execute();

MyAsyncTask是一个类对象,它扩展了AsyncTask并重载了标准方法onPreExecute、doInBackground、onProgressUpdate和onPostExecute。

我尝试遵循这里列出的一些建议...http://steveliles.github.io/android_s_asynctask.html

1个回答

11
将您的构建目标设置为API Level 11或更高版本。请注意,“构建目标” !=“目标SDK”(android:targetSdkVersion)。在Eclipse中,可以在项目>属性> Android或project.properties中进行命令行构建设置“构建目标”。对于executeOnExecutor()的条件使用,另一种方法是使用单独的帮助程序方法。
  @TargetApi(11)
  static public <T> void executeAsyncTask(AsyncTask<T, ?, ?> task,
                                          T... params) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
      task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
    }
    else {
      task.execute(params);
    }
  }

您可以使用此方法启动任务:

 executeAsyncTask(new MyTask(), param1, param2);

(对于您想要传递给execute()的任何参数)

非常感谢,我只是不明白为什么无法看到executeOnExecutor()方法。通过更改Android构建目标并适当提高它,我已经解决了这个问题。 - Joey Bob
@CommonsWare:你好,我知道executeOnExecutor参数为SERIAL_EXECUTOR的目的是为了“按顺序一个接一个地执行任务”的执行程序。但是在这种情况下,我尝试了但无法解决问题,你能帮忙吗? - Huy Tower

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接