AsyncTask onPostExecute никогда не вызван

Я не уверен, что я делаю неправильно, но onPostExecute никогда не вызывается.

  • Создан базовый класс под названием BaseActivity.java
  • В моей первоначальной деятельности я расширил этот класс.
  • Размещенный класс PostToOpenFeint внутри BaseActivity
  • Вызывается из потока пользовательского интерфейса из основного действия, которое я выполняю:

    new PostToOpenFeint.execute();
    

Функция onPreExecute(), doInBackground (..) запускается, но по какой-то причине onPostExecute никогда не вызывается.

Благодарим вас в Advance!

Dave

 private class PostToOpenFeint extends AsyncTask<Void, Void, Void> {
  /*
   * (non-Javadoc)
   * 
   * @see android.os.AsyncTask#doInBackground(Params[])
   */
  @Override
  protected Void doInBackground(Void... params) {
   // does all the work here
   return null;
  }


  /*
   * (non-Javadoc)
   * 
   * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
   */
  @Override
  protected void onPostExecute(Void result) {
   // TODO Auto-generated method stub
   super.onPostExecute(result);
   Toast.makeText(MainScreen.this, "Done syncing", Toast.LENGTH_LONG).show();
  }

  /*
   * (non-Javadoc)
   * 
   * @see android.os.AsyncTask#onPreExecute()
   */
  @Override
  protected void onPreExecute() {
   // TODO Auto-generated method stub
   super.onPreExecute();
   Toast.makeText(MainScreen.this, "About to sync all your scores", Toast.LENGTH_LONG).show();
  }

Вглядываясь в это больше, это то, что я смог наблюдать. Например, если я помещаю этот вызов:

 new PostToOpenFeint.execute();

Сразу после onCreate of Activity, все работает нормально. Если я поставлю этот вызов, скажите внутри прослушивателя кнопок.

settingsButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
   new PostToOpenFeint.execute();
}
});

OnPostExecute() никогда не вызывается, не уверен, что я делаю неправильно. Ограничение, которое я прочитал, это назвать это из потока пользовательского интерфейса, и я вызываю его из потока пользовательского интерфейса.

Ответ 1

У меня была подобная проблема только сейчас. Я расширял AsyncTask<Integer,Integer,Integer>, и мой метод onPostExecute выглядел так:

protected void onPostExecute(int result)

Мне это показалось хорошо, но опять же я больше парень .NET, чем парень из Java. Я изменил его на:

protected void onPostExecute(Integer result)

потому что по какой-то причине Java считает, что существует разница между int и Integer?

Я думаю, что ваша проблема заключается в том, что вы объявляете возвращаемый тип как void в своем:

extends<Void,Void,Void>

Это означает отсутствие параметров, никакого прогресса и никакого результата. Если вы хотите что-то выполнить, когда это будет сделано, я думаю, вам нужно дать ему какое-то значение типа integer или boolean.

Если вы измените ваши расширения на:

<Void,Void,Integer>

Теперь вы не проходите никаких параметров, не публикуя никакого прогресса, а возвращаете значение. Измените свой метод onPostExecute, чтобы принять Integer:

protected void onPostExecute(Integer result)

Затем измените значение возвращаемого значения в методе doInBackground следующим образом:

return 1;

Затем он должен выполнить для вас.

Ответ 2

Там еще один вопрос о AsyncTasks, который я провел всего полдня:

Класс AsyncTask должен быть загружен в поток пользовательского интерфейса. Готово автоматически по состоянию на JELLY_BEAN.

Задает документацию. На Gingerbread (и, возможно, раньше), учитывая правильные обстоятельства, это приводит к тому, что onPostExecute не выполняется. Решение, однако, легко, просто

new MyAsyncTask();

в начале потока пользовательского интерфейса, поэтому класс загружается, прежде чем что-либо в фоновом режиме может случайно загрузить его.

Я использовал статическую функцию в моем подклассе AsyncTask из фонового потока, который в зависимости от времени был вызван до того, как что-либо в потоке пользовательского интерфейса, используемого подклассом AsyncTask, и bingo, хороший Heisenbug.

(Послушай меня, отвечая на этот старый, уже ответивший вопрос, но я не нашел эту информацию в любом месте, и это мой первый пост)

Ответ 3

Обратите внимание, что если отменить задачу с помощью cancel(), onPostExecute() не будет вызываться. Довольно логично, но просто игнорируя вызов этого метода, я был в тупике.

Ответ 4

Моя проблема заключалась в том, что я как-то не выполнил @Override метод onPostExecute правильно. Я исправил это, щелкнув правой кнопкой мыши- > исходный- > метод Override\Implement.

Надеюсь, что это поможет кому-то

Ответ 5

Возможно, код в doInBackground() никогда не возвращается?

Ответ 6

Просто добавьте этот код в свою деятельность. Его проблема Async Task не инициализируется должным образом, как и предполагалось.

          try {
                Class.forName("android.os.AsyncTask");
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

Ответ 7

Просто измените параметры в onPostExecute

@Override
protected void onPostExecute(Void unused) {
...}

Теперь нужно вызвать метод.

Ответ 8

Просто используйте соответствующие параметры в onPostExecute,  использование  public void onPostExecute (Boolean response) { } вместо public void onPostExecute (логический ответ) { } это решило мою проблему

Ответ 9

Просто верните что-нибудь, а не ноль, и это сработает!
например:
return "done";