Исключение AsyncTask NullPointerException нажатие кнопки «Назад»

#java #android #android-asynctask #android-arrayadapter

#java #Android #android-asynctask #android-arrayadapter

Вопрос:

Это моя ситуация. У меня есть эта асинхронная задача:

 private class Logo extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute(); 
        }

        @Override
        protected Void doInBackground(Void... params) {

            try {
                // Connect to the web site
                Document document = Jsoup.connect(BLOG_URL).get();
                // Using Elements to get the class data 
                // Locate the src attribute
                for(Element img : document.select("div.col-1-1 .image img[src]")) {
                    String ImgSrc = img.attr("src");
                    // Download image from URL
                    InputStream is = new java.net.URL(ImgSrc).openStream();
                    //add Bitmap to an array
                    bitmap.add(BitmapFactory.decodeStream(is));
                 }
            } catch (IOException e) {
                e.printStackTrace();
                Log.e("ESEMPIO", "ERRORE NEL PARSING DELLE IMMAGINI");
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {

            ParsingAdapterCategorie adapter = new ParsingAdapterCategorie(getActivity(), titoli, bitmap, data);
            lista.setAdapter(adapter);

        }
    }
  

Если я нажимаю кнопку «Назад», происходит сбой с ошибкой журнала, подобной:

 FATAL EXCEPTION: main
java.lang.NullPointerException
at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:166)
  

Я думаю, это потому, что результат действия равен нулю. Что я могу сделать?

Комментарии:

1. ваша проблема в конструкторе адаптера.

2. Ваша асинхронная задача выполняется в фоновом режиме, но ваша активность завершена, поэтому она равна нулю..

3. Адаптер работает хорошо.. Все работает.. Сбой возникает только при выходе из приложения до его завершения

4. Это потому, что ваша активность была прервана.

5. @kalyanpvs фактически! Но я не знаю, как я могу решить. Вот почему я написал здесь 🙂

Ответ №1:

По сути, вы должны поместить код onPostExecute() внутрь if(getActivity() != null) … чтобы предотвратить такие случаи, как поворот экрана..

Но с чего вы начинаете выполнение AsyncTask()? Вы должны уважать жизненный цикл фрагмента … например, вы должны вызывать его для Fragment.onActivityCreated() ИЛИ Fragment.onResume() .. НЕ для Fragment.onCreate(), потому что на данный момент activity еще не прикреплена .. поэтому getActivity() всегда будет нулевым.

Комментарии:

1. рад помочь! Удачи!

Ответ №2:

Отмените его в onDestroy

 @Override
public void onDestroy() {
    if (asynchtask!=null) {
        asynchtask.cancel(true);
    }
    super.onDestroy();
}
  

Ответ №3:

Вместо использования AsyncTask может потребоваться использовать IntentService

Проверьте это

http://developer.android.com/training/run-background-service/create-service.html

Ответ №4:

AsyncTask выполняется в фоновом режиме, пока действие завершено. Таким образом, getActivity() возвращает null. Вы должны изменить свой код следующим образом и передать контекст в конструкторе вашей AsyncTask.

 private class Logo extends AsyncTask<Void, Void, Void> {
    private Context context;

    public Logo(Context context) {
        this.context = context;
    }

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

    @Override
    protected Void doInBackground(Void... params) {

        try {
            // Connect to the web site
            Document document = Jsoup.connect(BLOG_URL).get();
            // Using Elements to get the class data 
            // Locate the src attribute
            for(Element img : document.select("div.col-1-1 .image img[src]")) {
                String ImgSrc = img.attr("src");
                // Download image from URL
                InputStream is = new java.net.URL(ImgSrc).openStream();
                //add Bitmap to an array
                bitmap.add(BitmapFactory.decodeStream(is));
             }
        } catch (IOException e) {
            e.printStackTrace();
            Log.e("ESEMPIO", "ERRORE NEL PARSING DELLE IMMAGINI");
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {

        ParsingAdapterCategorie adapter = new ParsingAdapterCategorie(context, titoli, bitmap, data);
        lista.setAdapter(adapter);

    }
}
  

Затем вы можете вызвать свою AsyncTask в действии следующим образом:

     Logo logo = new Logo(this);
    logo.execute();
  

Надеюсь, это решило вашу проблему! 😉

С наилучшими пожеланиями.

Комментарии:

1. ммм, даже если это фрагмент, а не действие?

2. Да, это работает, даже если вы вызываете его во фрагменте. Но не вызывайте это в onCreate()-методе. Вместо этого вы должны поместить код в метод onActiviyCreated() фрагмента.

Ответ №5:

Это поможет вам..

if(null != getActivity) { //Вставить ваш код

}

Комментарии:

1. в onPostExecute()? Нравится if(null != getActivity) { ParsingAdapterCategorie adapter = new ParsingAdapterCategorie(getActivity(), titoli, bitmap, data); lista.setAdapter(adapter); } ?

2. При каждом выполнении AsyncTask onpost вы должны проверять, существует ли activity или нет. Если activity не существует, произойдет сбой.