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";