Intereting Posts
Как получить захват экрана при двойном разрешении? Dalvik / CleanSpec.mk: 47: *** отсутствует разделитель. Стоп. Ошибка создания AOSP Преобразование из String в BigDecimal для вычисления математики в валюте Как обнаружить глаза и рот в андроиде Android OpenGL текстуры выглядят ужасно на Sprint Samsung Galaxy s2 Epic Touch 4g Достижения Google Play «IOException: адрес уже используется» Запретить фильтр сеанса LogCat от кражи фокуса Значение, проходящее через Intent, возвращает null некоторое время Android: InflateException: двоичная строка XML-файла: ошибка раздувания класса <unknown> Android Print Framework – печать без масштабирования / фитинга Android Gradle – добавьте packageNameSuffix на конкретный продуктFlavor Как объединить вызов программным способом, когда выполняется другой вызов (Конференц-вызов) Содержимое адаптера изменилось, но ListView не получил уведомление – с помощью AsyncTask Конвертировать JSON в Android Bundle Получение вращения из ExifInterface всегда возвращает 0

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

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

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

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

Как и потоки, 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]); } } 

}