2013-05-30 36 views
4

我在我的android应用程序中运行的一些异步任务有点问题。由于我正在使用某个网络IO,因此有时可能需要比预期更长的时间,并阻止其他异步任务运行。异步任务..不能调用executeOnExecutor()

我需要保持我的目标和min sdk版本,因为它们是以minSdkVersion =“8”为目标targetSdkVersion =“15”。我需要它,以便在调用Async任务时,我可以检查设备SDK,如果大于11,它可以调用executeOnExecutor(),而不是仅仅执行,以允许设备并行运行这些任务并阻止这种阻塞操作。

MyAsyncTask(this).executeOnExecutor(); 

我得到一个错误“的方法executeOnExecutor()是:

虽然我有15个目标SDK,打电话时我使用的设备有17

的SDK但是未定义的类型”,并提供给我唯一的选择就是:

MyAsyncTask(this).execute(); 

MyAsyncTask是一个扩展的AsyncTask和过载的标准方法onPreExecute,doInBackgroun类对象d,onProgressUpdate & onPostExecute。

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

回答

11

设置您的构建目标API级别11或更高。请注意,“构建目标”!=“目标SDK”(android:targetSdkVersion)。 “生成目标”在Eclipse的Project> Properties> Android中设置,或者在命令行生成中设置project.properties

对于有条件使用executeOnExecutor(),另一种方法是使用一个单独的helper方法:

@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); 

(用于然而,许多你想传递的参数​​)

+0

确实谢谢,我只是不明白为什么它不会让我看到executeOnExecutor()方法。我已经解决了这个问题,通过更改android build target并适当地提高它。 –

+0

@CommonsWare:你好,我知道'executeOnExecutor'的参数是'SERIAL_EXECUTOR'的目的,这个'执行器按顺序一次执行一个任务.'但是[在这种情况下](http://stackoverflow.com/问题/ 22889968/doinbackground-run-so-fast-when-using-asynctask-in-fragment)我试过但无法解决问题,你想帮我吗? –