2014-08-27 100 views
0

我正在調用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

回答

2

您不能更改無效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

相關問題