#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 не существует, произойдет сбой.