Android: обратная кнопка во время асинтеза

У меня есть Activity, который показывает listview. На элементе щелкните по второму активному действию, в котором запускается AsyncTask, который извлекает удаленный URL-адрес на основе того, какой элемент кликается, анализирует результаты, а затем отображает эти результаты в другое представление списка. Во время выполнения задачи async у меня есть представление «загрузка», которое отображает только изображение и текст. Проблема в том, что если я инициирую действие, выполняющее задачу async, затем вернусь назад и запустим другой экземпляр указанного действия, я закрою силу.

я пытался

  Частный класс getlist расширяет AsyncTask реализует OnDismissListener {
      ...
      @Override
      Public void onDismiss (DialogInterface arg0) {
           this.cancel (истина);
      }
 } 

Но проблема сохраняется.

Я также поставил

 если (! isCancelled ()) {
   setContentView (R.layout.list);
   ...
   и т.п.

 }

В мой вызов onPostExecute, но либо это не мешает переключению просмотра, либо проблема – это что-то другое.

Logcat показывает «неожиданное возобновление в то время, когда оно уже возобновлено .. получил RemoteException, отправив setActive (false) уведомление« Затем немного дальше в журнале », java.net.SocketTimeoutException: Socket не подключен»

Как я могу это решить?

Обновить:

 E / AndroidRuntime (19379): обработчик нечистоты: поток AsyncTask # 2 выходит из-за неперехваченного исключения
 E / AndroidRuntime (19379): java.lang.RuntimeException: Произошла ошибка во время выполнения doInBackground ()
 E / AndroidRuntime (19379): at android.os.AsyncTask $ 3.done (AsyncTask.java:200)
 E / AndroidRuntime (19379): при java.util.concurrent.FutureTask $ Sync.innerSetException (FutureTask.java:273)
 E / AndroidRuntime (19379): при java.util.concurrent.FutureTask.setException (FutureTask.java:124)
 E / AndroidRuntime (19379): при java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:307)
 E / AndroidRuntime (19379): в java.util.concurrent.FutureTask.run (FutureTask.java:137)
 E / AndroidRuntime (19379): в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1068)
 E / AndroidRuntime (19379): при java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:561)
 E / AndroidRuntime (19379): на java.lang.Thread.run (Thread.java:1096)
 E / AndroidRuntime (19379): вызвано: java.lang.NullPointerException
 E / AndroidRuntime (19379): на com.metatroid.android.swim.ThreadViewer.getPosts (ThreadViewer.java:153)
 E / AndroidRuntime (19379): на com.metatroid.android.swim.ThreadViewer $ getlist.doInBackground (ThreadViewer.java:70)
 E / AndroidRuntime (19379): на com.metatroid.android.swim.ThreadViewer $ getlist.doInBackground (ThreadViewer.java:1)
 E / AndroidRuntime (19379): at android.os.AsyncTask $ 2.call (AsyncTask.java:185)
 E / AndroidRuntime (19379): при java.util.concurrent.FutureTask $ Sync.innerRun 

Solutions Collecting From Web of "Android: обратная кнопка во время асинтеза"

Фактическим решением этой проблемы было использование ThreadSafeClientConnManager для ClientConnectionManager

например

 BasicHttpParams params = new BasicHttpParams ();
 Схема регрессииRegistry = new SchemeRegistry ();
 SchemRegistry.register (новая схема («http», PlainSocketFactory.getSocketFactory (), 80));
 Final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory ();
 SchemRegistry.register (новая схема («https», sslSocketFactory, 443));
 ClientConnectionManager cm = новый ThreadSafeClientConnManager (params, schemRegistry);
 DefaultHttpClient httpclient = new DefaultHttpClient (cm, params);

Не делайте доступ к активности из doInBackground() . Доступ к активности можно onPostExecute() в onPostExecute() , publishProgress() или onPreExecute() , и даже тогда с некоторой осторожностью обрабатывать изменения конфигурации и т. Д.

Я бы рекомендовал вам сделать getlist статическим внутренним классом, а не обычным внутренним классом. Вручную свяжите задачу и активность и разбейте эту связь при уничтожении активности или изменении ее конфигурации. onPostExecute() ваши onPostExecute() и kin должны проверить, чтобы у него была действительная активность, прежде чем пытаться ее использовать.

Это примерное приложение демонстрирует часть этого – обработку изменения конфигурации. Он явно не обрабатывает сценарий кнопки BACK, но ему не нужно, поскольку он просто обновляет активность, которая отключена.

С точки зрения того, почему getPosts() имеет getPosts() NullPointerException, это зависит от вас, чтобы определить.