当应用程序在后台时异步任务崩溃
我正在调用Asynctask从Json服务获取响应并在后执行中设置列表。它的工作正常,但当我打开任何其他应用程序,然后再次打开我的应用程序。我在执行后得到NPE。任何想法为什么发生。任何帮助将不胜感激。当应用程序在后台时异步任务崩溃
public class AsyncTaskParks extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
utility.showProgress(getActivity(), "Please Wait", "Loading..");
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
String response = mServiceHandler
.getSoapResponseByMethod("GetSiteList");
Log.d("Response: ", "> " + response);
if (response != null) {
try {
JSONObject jsonObject = new JSONObject(response);
JSONArray rows = jsonObject.getJSONArray("Rows");
for (int i = 0; i < rows.length(); i++) {
JSONObject c = rows.getJSONObject(i);
infoParks = new InfobeanParks();
String siteId = c.getString("SiteID");
infoParks.setSiteId(siteId);
String siteType = c.getString("SiteType");
infoParks.setSiteType(siteType);
String siteName = c.getString("SiteName");
infoParks.setSiteName(siteName);
String siteShortName = c.getString("SiteShortName");
infoParks.setSiteShortName(siteShortName);
String siteImage = c.getString("SiteImage");
infoParks.setSiteImage(siteImage);
if (siteType.equalsIgnoreCase("P")) {
lstPark.add(infoParks);
}
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return response;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
utility.dismissProgress();
gridviewParks.setAdapter(new GridviewParksAdapter(getActivity(),
lstPark));
}
}
08-28 00:58:15.911: E/AndroidRuntime(3720): FATAL EXCEPTION: main
08-28 00:58:15.911: E/AndroidRuntime(3720): Process: com.oceancity.ocparks, PID: 3720
08-28 00:58:15.911: E/AndroidRuntime(3720): java.lang.NullPointerException
08-28 00:58:15.911: E/AndroidRuntime(3720): at com.ocparks.adapter.GridviewParksAdapter.<init>(GridviewParksAdapter.java:47)
08-28 00:58:15.911: E/AndroidRuntime(3720): at com.ocparks.FragmentParks$AsyncTaskParks.onPostExecute(FragmentParks.java:201)
08-28 00:58:15.911: E/AndroidRuntime(3720): at com.ocparks.FragmentParks$AsyncTaskParks.onPostExecute(FragmentParks.java:1)
08-28 00:58:15.911: E/AndroidRuntime(3720): at android.os.AsyncTask.finish(AsyncTask.java:632)
08-28 00:58:15.911: E/AndroidRuntime(3720): at android.os.AsyncTask.access$600(AsyncTask.java:177)
08-28 00:58:15.911: E/AndroidRuntime(3720): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
08-28 00:58:15.911: E/AndroidRuntime(3720): at android.os.Handler.dispatchMessage(Handler.java:102)
08-28 00:58:15.911: E/AndroidRuntime(3720): at android.os.Looper.loop(Looper.java:136)
08-28 00:58:15.911: E/AndroidRuntime(3720): at android.app.ActivityThread.main(ActivityThread.java:5086)
08-28 00:58:15.911: E/AndroidRuntime(3720): at java.lang.reflect.Method.invokeNative(Native Method)
08-28 00:58:15.911: E/AndroidRuntime(3720): at java.lang.reflect.Method.invoke(Method.java:515)
08-28 00:58:15.911: E/AndroidRuntime(3720): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
08-28 00:58:15.911: E/AndroidRuntime(3720): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
08-28 00:58:15.911: E/AndroidRuntime(3720): at dalvik.system.NativeStart.main(Native Method)
您不能更改无效Activity
的意见。您需要检查Activity
仍在onPostExecute
中运行还是更好,只需在onPause或onStop方法中完全取消ASyncTask
即可。
public void onPause() {
super.onPause();
if (mAsyncTaskParks != null){
mAsyncTaskParks.cancel();
}
}
第二种方法的好处是,它会调用ASyncTask's
onCancelled
方法,这将使你取消网络呼叫,如果这是你想要做什么。
否它没有工作。应用程序会在我将其推入背景时立即崩溃。 – 2014-08-27 23:11:54
cancel(boolean mayInterruptIfRunning)...如果执行此任务的线程应该被中断,则为true;否则,正在进行的任务被允许完成。 – 2014-08-27 23:15:27
你在片段内运行这个吗? – 2014-08-27 23:15:57
什么是'gridviewParks'?以及如何找到它?发布完整的代码。 – 2014-08-27 23:02:28