Невозможно переопределить метод onPostExecute() в классе AsyncTask

Я знаю, что есть несколько вопросов, которые очень похожи на этот, но пока они мне не помогли. Я до сих пор не могу переопределить этот AsyncTasks. Вы можете мне помочь?

Я уже убедился, что doInBackground() поддерживает некоторый тип, который требуется onPostExecute() (логическое значение в первом и JSON во втором примере).

Вы видите что-нибудь, кроме того, что я расширяю AsyncTask как необработанный тип (не знал, что здесь вводить)

Это затмение ошибки сообщает мне для каждого метода:

Метод onPostExecute(Boolean) типа Register.NetCheck должен переопределять или реализовывать метод супертипа.

и для классов затмение говорит мне:

  • Тип Register.NetCheck должен реализовывать унаследованный абстрактный метод AsyncTask.doInBackground(Object...)

  • AsyncTask — это необработанный тип. Ссылки на общий тип AsyncTask должны быть параметризованы.

ПРИМЕР 1:

private class NetCheck extends AsyncTask {

        @Override
        protected void onPreExecute(){
            super.onPreExecute();
            do.something();
        }

        @Override
        protected Boolean doInBackground (String... args){
               if (do.something.worked){
                   return true; }
               else { return false}
        }

        @Override
        protected void onPostExecute(Boolean th){
            evalute.input.boolValue();
        }
    }

ПРИМЕР 2:

private class ProcessRegister extends AsyncTask {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            show.some.dialog();
        }
        @Override
        protected JSONObject doInBackground(String... args) {
        JSONObject json = generate.some.json();
            return json;
        }
        @Override
        protected void onPostExecute(JSONObject json) {
           evaluate.something();
        }

}

person Krummy    schedule 07.03.2015    source источник


Ответы (2)


Ваша асинхронная задача не ожидает возвращаемого значения, поэтому она не распознает

protected void onPostExecute(Boolean th)

Попробуйте это вместо этого:

private class NetCheck extends AsyncTask<String, Void, Boolean> {

    @Override
    protected void onPreExecute(){
        super.onPreExecute();
        do.something();
    }

    @Override
    protected Boolean doInBackground (String... args){
           if (do.something.worked){
               return true; }
           else { return false}
    }

    @Override
    protected void onPostExecute(Boolean th){
        evalute.input.boolValue();
    }
}

Замените Boolean на JSONObject для второго примера. Старайтесь всегда использовать IDE для автоматической реализации методов, чтобы избежать подобных проблем.

person Joe Maher    schedule 07.03.2015
comment
не могли бы вы сказать мне, почему использовать doInBackground (Void... params) вместо моей версии с doInBackground (String... args). Просто для вашего сведения: я скопировал этот фрагмент кода откуда-то еще и попытался подогнать его под свои нужды. - person Krummy; 07.03.2015
comment
Внес поправки @Krummy - person Joe Maher; 07.03.2015

Вы должны расширить AsyncTask с помощью типов. См. пример ниже.

public class MyTask extends AsyncTask<Void, String, Integer> {
    @Override
    protected Integer doInBackground(Void... params) {
        return null;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(Integer integer) {
        super.onPostExecute(integer);
    }

    @Override
    protected void onProgressUpdate(String... values) {
        super.onProgressUpdate(values);
    }

    @Override
    protected void onCancelled(Integer integer) {
        super.onCancelled(integer);
    }

    @Override
    protected void onCancelled() {
        super.onCancelled();
    }
}

Заменяет Void, String, Integer соответствующими типами. Дополнительная информация находится здесь. О затмении. Удалите и установите Android Studio.

person localhost    schedule 07.03.2015
comment
Можете ли вы объяснить мне, почему в оболочке я использую типы <void, void, void> вместо, например, <String, Object, Boolean> или как тот, у кого другой ответ сказал <Void, Void, Boolean>? - person Krummy; 07.03.2015
comment
Первый параметр, String, указывает, что вы будете передавать строку в качестве параметра в задачу при выполнении, второй, Object, представляет единицы прогресса, которые будут опубликованы во время выполнения задачи, а третий представляет тип результат асинхронной задачи будет производиться - person Joe Maher; 07.03.2015
comment
Я только что понял все это намного больше, чем несколько минут назад! :D Большое спасибо за ваш очень быстрый ответ! - person Krummy; 07.03.2015
comment
Теперь это должно работать: onPostExecute(JSONObject s) - person Akhil Sahu; 21.10.2019