2011-09-01 75 views
0

我目前正在嘗試用異步任務填充片段。這主要是一個練習,因爲真正的實現會從SQLite數據庫中獲取數據 - 但是我必須在某個時間實現GSON/SOAP同步 - 我想這個問題保持不變。_NullReferenceException_完成Android片段後,AsyncTask

我從Web服務獲取所有數據後無法填充我的FragmentList,但我得到一個NullReferenceException - 但我無法真正發現我的錯誤。

如果webservice沒有返回任何數據,我不會收到異常。

在一個Sitenote - 爲什麼Android的再次接觸webservice時我換手機

public class ClosestPlaces extends FragmentActivity { 

private static KantinenListe kantinen; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    requestWindowFeature(Window.FEATURE_ACTION_BAR);   
    setContentView(R.layout.kantinen_results); 

} 

/** 
* This is the "top-level" fragment, showing a list of items that the 
* user can pick. Upon picking an item, it takes care of displaying the 
* data to the user as appropriate based on the currrent UI layout. 
*/ 

public static class TitlesFragment extends ListFragment { 
    boolean mDualPane; 
    int mCurCheckPosition = 0; 


    private class BuildKantinen extends AsyncTask<String, Integer, KantinenListe> { 

     private KantinenListe kantinen; 


     @Override 
     protected KantinenListe doInBackground(String... params) { 
      try{ 

       Gson gson = new Gson();    
       // SOAP Test 
       String NAMESPACE = "http://tempuri.org/"; 
       String METHOD_NAME = "fullSyncGPS"; 
       String SOAP_ACTION = "http://tempuri.org/IDatenService/fullSyncGPS"; 
       String URL = "http://webserviceURL?wsdl"; 

       SoapObject request = new SoapObject(NAMESPACE,METHOD_NAME); 

       PropertyInfo pi = new PropertyInfo(); 
       request.addProperty("radius",10); 
       request.addProperty("lat", "14.089201"); 
       request.addProperty("lng", "02.136459"); 
       request.addProperty("von", "01.09.2011"); 
       request.addProperty("bis", "01.09.2011"); 

       SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
       envelope.dotNet = true; 
       envelope.setOutputSoapObject(request);   

       HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
       androidHttpTransport.call(SOAP_ACTION, envelope); 
       SoapPrimitive result = (SoapPrimitive)envelope.getResponse(); 

       String resultData = result.toString(); 


       resultData = "{\"meineKantinen\":"+resultData+"}"; 
       this.kantinen = gson.fromJson(resultData, KantinenListe.class); 
       Log.i("test", "blubber"); 
      } 
      catch(Exception e) 
      { 
       e.printStackTrace(); 
      } 
       return this.kantinen; 

     } 

     @Override 
     protected void onPostExecute(KantinenListe result) { 
      // populate the List with the data 
      Log.i("test", "postexecute"); 
      setListAdapter(new MenuAdapter(getActivity(), R.layout.simple_list_item_checkable_1, kantinen.getMeineKantinen())); 
     } 
    } 


    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     new BuildKantinen().execute("test");      

     if (savedInstanceState != null) { 
      // Restore last state for checked position. 
      mCurCheckPosition = savedInstanceState.getInt("curChoice", 0); 
     } 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("curChoice", mCurCheckPosition); 
    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     showDetails(position);    
    } 

    /** 
    * Helper function to show the details of a selected item, either by 
    * displaying a fragment in-place in the current UI, or starting a 
    * whole new activity in which it is displayed. 
    */ 
    void showDetails(int index) { 
     mCurCheckPosition = index; 

      // Otherwise we need to launch a new activity to display 
      // the dialog fragment with selected text. 
      Log.i("Test",Integer.toString(index)); 
      Intent intent = new Intent(); 
      intent.setClass(getActivity(), BeAPartner.class); 
      startActivity(intent); 
    } 
} 

public static class MenuAdapter extends ArrayAdapter { 

    private LayoutInflater mInflater; 
    private List<Kantine> items; 
    private Context context; 

    public MenuAdapter(Context context, int textViewResourceId, List<Kantine> items) { 
     super(context, textViewResourceId); 
     mInflater = LayoutInflater.from(context); 
     this.items = items; 
     this.context = context; 
    } 

    @Override 
    public int getCount() { 
     return items.size(); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 

     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.menu_row, parent, false); 
      holder = new ViewHolder(); 
      holder.color = (TextView) convertView.findViewById(R.id.color); 
      holder.title = (TextView) convertView.findViewById(R.id.detail); 
      holder.subdetail = (TextView) convertView.findViewById(R.id.subdetail); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     // Fill in the actual story info 
     Kantine s = items.get(position); 

     s.setName(Html.fromHtml(s.getName()).toString()); 
     if (s.getName().length() > 35) 
      holder.title.setText(s.getName().substring(0, 32) + "..."); 
     else 
      holder.title.setText(s.getName()); 

     Log.i("display", "Here I am"); 
     return convertView; 
    } 


} 
    static class ViewHolder { 
     TextView color; 
     TextView title; 
     TextView subdetail; 
    } 

}取向

的logcat說以下內容:

09-01 17:16:31.830: INFO/test(2104): postexecute 
09-01 17:16:31.830: DEBUG/AndroidRuntime(2104): Shutting down VM 
09-01 17:16:31.830: WARN/dalvikvm(2104): threadid=1: thread exiting with uncaught exception (group=0x40243560) 
09-01 17:16:31.830: ERROR/AndroidRuntime(2104): FATAL EXCEPTION: main 
09-01 17:16:31.830: ERROR/AndroidRuntime(2104): java.lang.NullPointerException 
09-01 17:16:31.830: ERROR/AndroidRuntime(2104):  at com.$TitlesFragment$BuildKantinen.onPostExecute(ClosestPlaces.java:117) 
09-01 17:16:31.830: ERROR/AndroidRuntime(2104):  at  com..ClosestPlaces$TitlesFragment$BuildKantinen.onPostExecute(ClosestPlaces.java:1) 
09-01 17:16:31.830: ERROR/AndroidRuntime(2104):  at  android.os.AsyncTask.finish(AsyncTask.java:417) 
09-01 17:16:31.830: ERROR/AndroidRuntime(2104):  at      android.os.AsyncTask.access$300(AsyncTask.java:127) 
09-01 17:16:31.830: ERROR/AndroidRuntime(2104):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) 
09-01 17:16:31.830: ERROR/AndroidRuntime(2104):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-01 17:16:31.830: ERROR/AndroidRuntime(2104):  at android.os.Looper.loop(Looper.java:123) 
09-01 17:16:31.830: ERROR/AndroidRuntime(2104):  at android.app.ActivityThread.main(ActivityThread.java:3835) 
09-01 17:16:31.830: ERROR/AndroidRuntime(2104):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-01 17:16:31.830: ERROR/AndroidRuntime(2104):  at java.lang.reflect.Method.invoke(Method.java:507) 
09-01 17:16:31.830: ERROR/AndroidRuntime(2104):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
09-01 17:16:31.830: ERROR/AndroidRuntime(2104):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
09-01 17:16:31.830: ERROR/AndroidRuntime(2104):  at dalvik.system.NativeStart.main(Native Method) 
+0

中檢查並處理NULL情況。好的,當應用程序無法連接到服務器時發生錯誤 - 但是我認爲它周圍的「try/catch」應該足以處理這種情況? – theXs

回答

1

在代碼,你什麼都不做,只是在異常被捕獲時纔打印堆棧跟蹤。你的doInBackground()總是返回一個kantinen。你應該在你的onPostExecute()