1

我试图让我的应用程序在旧版本的 Android 上运行,特别是 API 10。

我已经下载了支持包并用它们解决了一些问题,但我正在努力解决这个问题:

字段需要 API 级别 11(当前最小值为 10):android.os.AsyncTask#THREAD_POOL_EXECUTOR

Thread_Pool_Executor 方法仅在 API 11 中添加。

有什么方法可以在 API 10 中使用它,还是必须恢复到:

myAsyncTask().execute();

代替:

myAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

如果是这样,我如何检查 API 级别?

4

2 回答 2

13

第 1 步:将您的构建目标(例如,Eclipse 中的项目 > 属性 > Android)设置为 API 级别 11 或更高。

第 2 步:Build.VERSION.SDK_INT用于确定您的 API 级别,executeOnExecutor()仅在较新的 Android 设备上使用。

例如,您可以在某处使用此静态实用程序方法:

  @TargetApi(Build.VERSION_CODES.HONEYCOMB)
  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(),将它传递给您的AsyncTask实例以及您想要传递给您的doInBackground()方法的任何参数。executeAsyncTask()将选择executeOnExecutor()API Level 11+ 或execute()在旧设备上使用。

于 2013-09-12T12:29:45.903 回答
0

这是一个有用的模板方法,我一直添加到我的 AsyncTasks 中:

public class MyClass extends AsyncTask <MyInput<Type1>, MyProgress<Type2>, MyResult<Type3>> {

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public void start(MyInput<Type1> params) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
          this.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
        } else {
           this.execute(params);
        }
    }
}

通过调用MyClass.start(params),我得到以下好处:

  1. 不同平台版本依赖的丑陋细节对用户隐藏
  2. 使用 THREAD_POOL_EXECUTOR 的机制对用户是隐藏的。
于 2014-04-04T04:15:07.960 回答