如何多次运行相同的asynctask?

我有我的asyncTask在活动第一次启动时运行,然后如果networking连接不可用,那么我有一个刷新button,尝试运行asyncTask再次尝试。 但我得到一个debugging错误说这个..

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) 

无论如何要运行两次?

只需创build另一个实例并执行它。

就像线程一样, AsyncTask不能被重用。 每次你想运行一个新的实例,你都必须创build一个新的实例。

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

但是,你仍然可以调用该线程上的方法,但是它们将在不是在另一个线程上调用它们的线程上运行 。 所以你将不得不创build一个新的。

只要做一个新的调用像新的asyncTask()。execute(); 您必须创build一个新对象来重新启动该任务。

我只是创build了asynctask,然后创build了一个可创buildasynctask的新实例的runnable。 然后你可以反复提交你的runnable到处理程序。

 class MyAsyncTask extends AsyncTask<String, Void, String>{ ...} Runnable myRunner = new Runnable(){ public void run() { new MyAsyncTask ().execute(...); }}; myHandler.post(myRunner); 

您不能多次运行一个AsyncTask的同一个实例。 假设你有一个名为MyAsyncTaks的AsyncTask,你打算做这样的事情,

  MyAsyncTask myAsyncTask = new MyAsyncTaks(); myAsyncTask.execute(); // Works as expected . . . . myAsyncTask.execute(); // This will throw you exception 

这样做的原因是,线程一旦完成其“运行”方法,就不能被分配另一个任务。 在这里,在第一次调用execute()时,你的AsyncTask开始运行,并且在完成它的工作之后,线程退出运行。 自然,execute()的下一次调用会抛出exception。

最简单的方法是创build一个MyAsyncTaks的新实例并调用execute。

  MyAsyncTask myAsyncTask = new MyAsyncTaks(); myAsyncTask.execute(); // Works as expected . . . MyAsyncTask myAsyncTask2 = new MyAsyncTaks(); myAsyncTask2.execute(); // Works as expected 

尽pipe这里不需要提到,但是一定要注意,发布Android SDK版本的Honeycomb,如果你一次运行多个AsyncTask,它们实际上是按顺序运行的。 如果你想并行运行它们,请改用executeOnExecutor。

我创build了一个types为ProgressUpdater(扩展AsyncTask的类的名称)的Arraylist,并添加了实例(在一个button的onClick中)。 所以你可以在需要的时候执行和取消这些任务。

 public class MainActivity extends Activity { ProgressBar progress; ProgressUpdater task; ArrayList<ProgressUpdater> pu = new ArrayList<MainActivity.ProgressUpdater>(); int count = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); progress = (ProgressBar) findViewById(R.id.progress); } public void onClick(View v) { switch (v.getId()) { case R.id.btn: task = new ProgressUpdater(); pu.add(task); count++; pu.get(count - 1).execute(0); System.out.println("task" + task); // task.execute(10); break; case R.id.btnCancel: if (count >= 0) { pu.get(count - 1).cancel(true); pu.remove(count - 1); count--; } // task.cancel(true); break; } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } private class ProgressUpdater extends AsyncTask<Integer, Integer, Void> { @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); progress = (ProgressBar) findViewById(R.id.progress); progress.setMax(100); } @Override protected Void doInBackground(Integer... params) { // TODO Auto-generated method stub int start = params[0]; for (int i = start; i <= 100; i++) { try { boolean cancelled = isCancelled(); if (!cancelled) { publishProgress(i); SystemClock.sleep(100); } } catch (Exception e) { e.printStackTrace(); } } return null; } @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub super.onPostExecute(result); Log.v("Progress", "Finished"); } @Override protected void onCancelled() { // TODO Auto-generated method stub super.onCancelled(); progress.setMax(0); } @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); progress.setProgress(values[0]); } } 

}