我在活动首次启动时运行了asyncTask,然后如果网络连接不可用,那么我有一个刷新按钮,尝试运行asyncTask再试一次.但我得到一个调试错误说这个..
07-29 18:14:21.290: ERROR/AndroidRuntime(9080): FATAL EXCEPTION: main
07-29 18:14:21.290: ERROR/AndroidRuntime(9080): java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)
07-29 18:14:21.290: ERROR/AndroidRuntime(9080): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:541)
07-29 18:14:21.290: ERROR/AndroidRuntime(9080): at android.os.AsyncTask.execute(AsyncTask.java:499)
07-29 18:14:21.290: ERROR/AndroidRuntime(9080): at com.fttech.gameIT.MainMenu$1.onClick(MainMenu.java:90)
Run Code Online (Sandbox Code Playgroud)
反正有两次运行吗?
Cri*_*ian 74
只需创建另一个实例并执行它.
Osc*_*mez 17
你永远不能再次执行一个线程,而Java不是在任何其他语言中,一旦完成该run()方法的线程,你就无法重新启动它,这就是你得到它的原因IllegalStateException.
但是,您仍然可以在该线程上调用方法,但它们将在不在其他线程上调用它们的线程上运行.因此,您必须创建一个新的.
您不能多次运行AsyncTask的相同实例.假设你有一个名为MyAsyncTaks的AsyncTask,你打算做这样的事情,
MyAsyncTask myAsyncTask = new MyAsyncTaks();
myAsyncTask.execute(); // Works as expected
.
.
.
.
myAsyncTask.execute(); // This will throw you exception
Run Code Online (Sandbox Code Playgroud)
原因是,线程一旦完成其"运行"方法,就无法分配另一个任务.这里,在第一次调用execute()时,你的AsyncTask开始运行,在完成它的工作后,线程就不再运行了.当然,下一次调用execute()会抛出异常.
不止一次运行它的最简单方法是创建MyAsyncTaks的新实例并在其上调用execute.
MyAsyncTask myAsyncTask = new MyAsyncTaks();
myAsyncTask.execute(); // Works as expected
.
.
.
MyAsyncTask myAsyncTask2 = new MyAsyncTaks();
myAsyncTask2.execute(); // Works as expected
Run Code Online (Sandbox Code Playgroud)
虽然这里不需要提及,但必须注意发布Android SDK版本的Honeycomb,如果你一次运行多个AsyncTask,它们实际上是按顺序运行的.如果要以parallally方式运行它们,请改用executeOnExecutor.