当应用程序在后台时异步任务崩溃

问题描述:

我正在调用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) 
+0

什么是'gridviewParks'?以及如何找到它?发布完整的代码。 – 2014-08-27 23:02:28

您不能更改无效Activity的意见。您需要检查Activity仍在onPostExecute中运行还是更好,只需在onPause或onStop方法中完全取消ASyncTask即可。

public void onPause() { 
    super.onPause(); 

    if (mAsyncTaskParks != null){ 
     mAsyncTaskParks.cancel(); 
    } 
} 

第二种方法的好处是,它会调用ASyncTask'sonCancelled方法,这将使你取消网络呼叫,如果这是你想要做什么。

+0

否它没有工作。应用程序会在我将其推入背景时立即崩溃。 – 2014-08-27 23:11:54

+0

cancel(boolean mayInterruptIfRunning)...如果执行此任务的线程应该被中断,则为true;否则,正在进行的任务被允许完成。 – 2014-08-27 23:15:27

+0

你在片段内运行这个吗? – 2014-08-27 23:15:57