Как запустить одну и ту же асинтету более одного раза?

Я запускаю мой 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) 

Есть ли все равно, чтобы запустить это дважды?

Solutions Collecting From Web of "Как запустить одну и ту же асинтету более одного раза?"

Просто создайте другой экземпляр и выполните его.

Как и потоки, AsyncTask s нельзя использовать повторно. Вы должны создавать новый экземпляр каждый раз, когда хотите его запустить.

Вы никогда не сможете выполнять поток снова, а не на Java , а не на каком-либо другом языке, как только поток выполняется с помощью метода run() , его нельзя перезапустить, поэтому вы получаете IllegalStateException .

Тем не менее, вы все равно можете вызвать методы в этом потоке, но они будут выполняться в потоке, который вызывает их НЕ на другом потоке . Поэтому вам нужно будет создать новый.

Просто сделайте новый вызов, как новый asyncTask (). Execute (); Вы должны создать новый объект для перезапуска этой задачи.

Я просто создаю asynctask, а затем создаю runnable, который создает новые экземпляры asynctask. Затем вы можете снова и снова пересылать ваш runnable обработчику.

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

Вы не можете запускать один и тот же экземпляр AsyncTask более одного раза. Предположим, у вас есть AsyncTask с именем MyAsyncTaks, и вы намерены сделать что-то подобное,

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

Причина этого заключается в том, что нить, однажды закончившая свой метод «run», не может быть назначена другой задаче. Здесь, при первом вызове execute (), ваш AsyncTask начал работать, и после выполнения своей работы поток выходит из строя. Естественно, следующий вызов execute () вызовет вам исключение.

Самый простой способ запускать это несколько раз – создать новый экземпляр MyAsyncTaks и вызвать его выполнение.

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

Хотя его не нужно упоминать здесь, нужно помнить, что после Android SDK версии Honeycomb, если вы запускаете сразу несколько Асинхронных задач, они фактически запускаются последовательно. Если вы хотите запустить их параллально, вместо этого используйте executeOnExecutor.

Я создал Arraylist типа ProgressUpdater (имя класса, который расширяет AsyncTask) и добавил в него экземпляры (в кнопке 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]); } } 

}