Асинхронная задача, когда не вызывается onPostExecute()?

#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() .