Android 2.3.3中AsyncTask调用抛出NoSuchFieldError异常

5

在Android 4.0.3上运行得很好,但在Android 2.3.3上出现错误。非常感谢您的帮助。粗体显示的那一行会引发错误。

public class TestLoadingTask extends AsyncTask<Object, Object, Void> {
}

btndownload.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        if (util.isNetworkAvailable(NewTakeTest.this)) {
                TestLoadingTask task;
        task = new TestLoadingTask();
        task.currentposition = position;
        task.testname = productsOnCloudList.getList().get(position).getProductname();
        **task.executeOnExecutor(task.THREAD_POOL_EXECUTOR, null);**
    }
    }
});

我是新来的stackoverflow用户,如果我无法清楚地解释我的问题,请原谅。

完整的日志如下所示。

09-01 17:07:10.853 E/AndroidRuntime(21188): FATAL EXCEPTION: main
09-01 17:07:10.853 E/AndroidRuntime(21188): java.lang.NoSuchFieldError: in.informationworks.app.CATapp.store.NewTakeTest$TestLoadingTask.THREAD_POOL_EXECUTOR
09-01 17:07:10.853 E/AndroidRuntime(21188): at in.informationworks.app.CATapp.store.NewTakeTest$CloudCustomAdapter$1.onClick(NewTakeTest.java:973)
09-01 17:07:10.853 E/AndroidRuntime(21188): at android.view.View.performClick(View.java:2533)
09-01 17:07:10.853 E/AndroidRuntime(21188): at android.view.View$PerformClick.run(View.java:9320)
09-01 17:07:10.853 E/AndroidRuntime(21188): at android.os.Handler.handleCallback(Handler.java:587)
09-01 17:07:10.853 E/AndroidRuntime(21188): at android.os.Handler.dispatchMessage(Handler.java:92)
09-01 17:07:10.853 E/AndroidRuntime(21188): at android.os.Looper.loop(Looper.java:150)
09-01 17:07:10.853 E/AndroidRuntime(21188): at android.app.ActivityThread.main(ActivityThread.java:4389)
09-01 17:07:10.853 E/AndroidRuntime(21188): at java.lang.reflect.Method.invokeNative(Native Method)
09-01 17:07:10.853 E/AndroidRuntime(21188): at java.lang.reflect.Method.invoke(Method.java:507)
09-01 17:07:10.853 E/AndroidRuntime(21188): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
09-01 17:07:10.853 E/AndroidRuntime(21188): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
09-01 17:07:10.853 E/AndroidRuntime(21188): at dalvik.system.NativeStart.main(Native Method)
09-01 17:07:10.863 E/EmbeddedLogger(  180): App crashed! Process: in.informationworks.app.CATapp
1个回答

9
你使用API Level 11或更高版本的构建目标编译了你的应用程序,但是在API Level 10或更低版本上运行该应用程序。executeOnExecutor()THREAD_POOL_EXECUTOR在API Level 11中添加,而在早期版本的Android中不存在。因此在这些设备上,你需要使用android.os.Build来检测你所在的Android版本并使用较旧的execute()方法。
例如:
  @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);
    }
  }

要使用这个功能,需要创建你的AsyncTask实例,并调用executeAsyncTask()方法,将AsyncTask对象作为第一个参数传递,并将传递给doInBackground()的任何其他参数作为剩余参数:

fooTask=new FooTask();
executeAsyncTask(fooTask, "these", "are", "optional");

嘿,马克,我在我的应用程序中使用了这段代码,包括@TargetApi(11)。但是Eclipse仍然显示Build.VERSION_CODES.HONEYCOMB和AsyncTask.THREAD_POOL_EXECUTOR上的错误(两者在api v8中都不可用)。可能的原因是什么? - Aswin Kumar
@AswinKumar:您的构建目标(例如,在Eclipse中选择项目>属性>Android)需要使用API Level 11或更高版本。 - CommonsWare
之前没太关注过这个目标。查了一下资料,理解了,现在它可以用了,谢谢 :-) - Aswin Kumar

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