#java #android #android-asynctask
#java #Android #android-asynctask
Вопрос:
Я пытаюсь убедиться, что я учитываю все возможности, чтобы избежать ошибок для пользователя.
У меня есть AsyncTask, который реализует интерфейс и возвращает ответ вызывающему классу в onPostExecute AsyncTask, как показано ниже:
public class GetVideoInfoFromDataBase extends AsyncTask {
Context context;
private AsyncInterface asyncInterface;
// Paginated list of results for alarm database scan
static PaginatedScanList<AlarmDynamoMappingAdapter> results;
// The DynamoDB object mapper for accessing DynamoDB.
private final DynamoDBMapper mapper;
public GetVideoInfoFromDataBase(Context context, AsyncInterface asyncInterface){
mapper = AWSMobileClient.defaultMobileClient().getDynamoDBMapper();
this.context = context;
this.asyncInterface = asyncInterface;
}
@Override
protected Object doInBackground(Object[] params) {
System.out.println("The backgrond stuff is working 1");
DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();
results = mapper.scan(AlarmDynamoMappingAdapter.class, scanExpression);
return results;
}
@Override
public void onPostExecute(Object obj) {
asyncInterface.response((PaginatedScanList<AlarmDynamoMappingAdapter> )obj);
}
}
Есть ли время, когда onPostExecute не будет вызываться, что означает, что интерфейс не вернет значение?
Заранее спасибо за вашу помощь.
Комментарии:
1.
onPostExecute
Должен быть вызван. Почему бы неSystem.out.println
сделать что-нибудь,onpostExecute
чтобы убедиться, вызвано ли оно.2. он нормально вызывается.
3. Я спрашиваю, была ли когда-нибудь ситуация, из-за которой она не вызывалась.
4.
onPostExecute
метод не будет вызван, если задача была отменена. В такой ситуации,onCancelled(Object)
вызывается в потоке пользовательского интерфейса послеdoInBackground(Object[])
возврата.5. Спасибо, значит, если мой вызов базы данных завершится неудачно, он все равно будет выполняться с нулевым значением? Предполагая, что я добавляю перехват попытки и перехватываю исключение.
Ответ №1:
onPostExecute()
будет выполняться до тех пор, пока doInBackground()
не вернется, и вы не отмените задачу явно (путем вызова cancel()
вашего AsyncTask
экземпляра).
Технически, onPostExecute()
будет вызван после (и если) успешного выполнения следующей строки:
return results;
До тех пор, пока ваш процесс не будет убит за это время.
Если вы отменили свою задачу, onCancelled()
будет вызван вместо onPostExecute()
.