这是我的情况。我有这个AsyncTask:
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)
这是因为我认为活动结果为空。我该怎么办?
答案 0 :(得分:2)
基本上你必须将onPostExecute()的代码放在if(getActivity()!= null)...中以防止像旋转屏幕这样的情况..
但是你在哪里开始你的AsyncTask execute()?你必须尊重片段的生命周期...例如,你应该在 Fragment.onActivityCreated()或 Fragment.onResume()上调用它。 Fragment.onCreate() 因为此时尚未附加活动..因此getActivity()将始终为 NULL 。
答案 1 :(得分:0)
在onDestroy中取消它
@Override
public void onDestroy() {
if (asynchtask!=null) {
asynchtask.cancel(true);
}
super.onDestroy();
}
答案 2 :(得分:0)
您可能需要使用 IntentService
,而不是使用 AsyncTask把它拿出来
http://developer.android.com/training/run-background-service/create-service.html
答案 3 :(得分:0)
活动结束时,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);
}
}
然后您可以按如下方式调用Activity中的AsyncTask:
Logo logo = new Logo(this);
logo.execute();
希望这能解决你的问题! ; - )
最好的问候。
答案 4 :(得分:-1)
这将有助于你..
if(null!= getActivity){ //粘贴你的代码
}