如何多次运行相同的asynctask?

cod*_*e22 50 android

我在活动首次启动时运行了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

只需创建另一个实例并执行它.

  • 禁用按钮,直到'AsyncTask`回来?顺便说一句,这是正确的方法,需要生成一个新的"AsyncTask". (4认同)
  • 你能举一个例子编辑你的答案吗? (4认同)

Rag*_*har 34

就像线程一样,AsyncTasks不能重用.每次要运行一个实例时,都必须创建一个新实例.


Osc*_*mez 17

你永远不能再次执行一个线程,而Java不是在任何其他语言中,一旦完成该run()方法的线程,你就无法重新启动它,这就是你得到它的原因IllegalStateException.

但是,您仍然可以在该线程上调用方法,但它们将在不在其他线程上调用它们的线程上运行.因此,您必须创建一个新的.


Kap*_*aps 6

您不能多次运行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.