【问题标题】:Async task.. cannot call executeOnExecutor()异步任务..无法调用 executeOnExecutor()
【发布时间】:2013-05-30 09:17:47
【问题描述】:

我的 android 应用程序中运行的一些异步任务有点问题。由于我使用了一些网络 IO,它有时会比预期花费更长的时间并阻止其他异步任务的运行。

我需要保持我的 target 和 min sdk 版本不变,但它们的目标是 targetSdkVersion="15",minSdkVersion="8"。我需要它,以便在调用异步任务时,我可以检查设备 SDK,如果大于 11,它可以调用 executeOnExecutor() 而不是只执行以允许设备并行运行这些任务并防止此阻塞操作。

虽然我的目标 SDK 为 15,但我使用的设备的 SDK 为 17。

但是调用时:

MyAsyncTask(this).executeOnExecutor();

我收到一个错误“未定义该类型的方法 executeOnExecutor()”,我唯一可用的选项是:

MyAsyncTask(this).execute();

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

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

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    将您的构建目标设置为 API 级别 11 或更高。请注意,“构建目标”!=“目标 SDK”(android:targetSdkVersion)。 “构建目标”在 Eclipse 上的 Project > Properties > 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 构建目标并适当地提高它来解决这个问题。
    • @CommonsWare : 你好,我知道executeOnExecutor 和参数SERIAL_EXECUTOR 的用途An Executor that executes tasks one at a time in serial order. 但是in this case 我试过但无法解决问题,你愿意帮助我吗?
    猜你喜欢
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    相关资源
    最近更新 更多