2014-10-02 139 views
-3

我有一個活動在列表視圖中顯示地點的類別。當我嘗試點擊列表項目時,由於NullPointerException,應用程序崩潰。以下是我才知道,我的Apdater獲得「nameAddressList」爲null,因爲不執行doInBakground代碼活動如何解決NullPointerException

public class ListOfPlacesActivity extends Activity { 

    ListView listView; 
    public String tag_name; 
    public List<NameAddress> nameAddressList; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_list_of_places); 

     listView = (ListView) findViewById(R.id.list_of_places); 

     Intent intent = getIntent(); 
     if(intent!= null) 
     { 
      tag_name = intent.getStringExtra("CategoryName"); 
     } 

     nameAddressList = null; 
     try 
     { 
      final XMLDOMParserHandler parser = new XMLDOMParserHandler(tag_name.toLowerCase(), this); 
      if(isConnectivityOn(this)){ 
       BackgroundRunner.doInBackground(new BackgroundRunner.DoInBackground() { 
        @Override 
        public void execute() { 
         try { 
          URL myURL = new URL("http://somewebsite.com/admin/data.xml"); 
          URLConnection ucon = myURL.openConnection(); 
          final InputStream is = ucon.getInputStream(); 
          runOnUiThread(new Runnable() { 
           @Override 
           public void run() { 
            nameAddressList = parser.parseXML(is); 
           } 
          }); 
         } catch (MalformedURLException e) { 
          e.printStackTrace(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        } 
       }); 
      } else { 
       nameAddressList = parser.parseXML(getAssets().open("data.xml")); 
      } 
      ListOfPlacesAdapter listOfPlacesAdapter = new ListOfPlacesAdapter(this, nameAddressList); 
      listView.setAdapter(listOfPlacesAdapter); 
      listView.setItemsCanFocus(true); 

     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public boolean isConnectivityOn(Context context) { 
     boolean resCode = false; 

     try { 
      ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
      resCode = cm.getActiveNetworkInfo().isConnectedOrConnecting(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return resCode; 
    } 
} 

從錯誤。所以它拋出了NullPointerException。我想知道如何解決這個問題

以下是我得到的錯誤:

java.lang.RuntimeException: Unable to start activity ComponentInfo{asm.sdsuhood.app/asm.sdsuhood.app.places.ListOfPlacesActivity}: java.lang.NullPointerException 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363) 
     at android.app.ActivityThread.access$900(ActivityThread.java:161) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:157) 
     at android.app.ActivityThread.main(ActivityThread.java:5356) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
     at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
     at asm.sdsuhood.app.places.ListOfPlacesAdapter.getCount(ListOfPlacesAdapter.java:43) 
     at android.widget.ListView.setAdapter(ListView.java:486) 
     at asm.sdsuhood.app.places.ListOfPlacesActivity.onCreate(ListOfPlacesActivity.java:81) 
     at android.app.Activity.performCreate(Activity.java:5426) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363) 
            at android.app.ActivityThread.access$900(ActivityThread.java:161) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:157) 
            at android.app.ActivityThread.main(ActivityThread.java:5356) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:515) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
            at dalvik.system.NativeStart.main(Native Method) 
+2

當您添加數據時,您會意識到數據爲空,因爲它尚未被後臺線程下載。你知道一個線程是如何工作的嗎?您需要填寫線程後的列表視圖在數據下載完成後 – 2014-10-02 14:44:52

+0

@Pedro Oliveria我在異步任務和線程之前從未工作過。你能告訴我如何編碼嗎?謝謝 – Akshay 2014-10-02 14:46:44

+0

nameAddressList爲空,除非你進入else條件;也許你錯誤地假設了。 – duffymo 2014-10-02 14:46:54

回答

1

讓你的聲明和的onCreate mthod是這樣的,所以當你發現獲得額外再調用異步類(基本上在另一個線程上進行長時間操作)。

ListView listView; 
public String tag_name; 
public List<NameAddress> nameAddressList; 
Context context; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_list_of_places); 

    context = YourActivityName.this; 

    listView = (ListView) findViewById(R.id.list_of_places); 

    Intent intent = getIntent(); 
    if (intent != null) { 
     tag_name = intent.getStringExtra("CategoryName"); 
     new ListAsync().execute(); 
    } 
} 

現在,新的ListAsync()。execute();此語句將調用您最終調用Web服務並將數據綁定到List的異步類,此操作必須在另一個線程上執行。

onPostExecute執行完該長期任務後,異步類方法將執行,並相應地進行更改以反映未使用的接口。

private class ListAsync extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPreExecute() { 
     Log.i("test", "Running on ui thread"); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     Log.i("test", "Doding long operation on another thread"); 
     final XMLDOMParserHandler parser = new XMLDOMParserHandler(
       tag_name.toLowerCase(), this); 
     if (isConnectivityOn(context)) { 
      try { 
       URL myURL = new URL("http://somewebsite.com/admin/data.xml"); 
       URLConnection ucon = myURL.openConnection(); 
       final InputStream is = ucon.getInputStream(); 
       nameAddressList = parser.parseXML(is); 
      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } else { 
      nameAddressList = parser.parseXML(getAssets().open("data.xml")); 
     } 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     Log.i("tag", "getting back to uo thread to update user interface"); 
     ListOfPlacesAdapter listOfPlacesAdapter = new ListOfPlacesAdapter(
       this, nameAddressList); 
     listView.setAdapter(listOfPlacesAdapter); 
     listView.setItemsCanFocus(true); 
    } 

} 

讓我知道,如果你卡在某個地方。

+0

當沒有數據連接性,因爲isConnectivityOn(ListOfPlacesActivity.this )給出錯誤「Class'android.content.Context'未加載」。所以它不會有其他條件 – Akshay 2014-10-02 17:53:12

+0

可能你的功能是使用上下文,所以我已經更新了我的答案,並將上下文內部異步。 – Chitrang 2014-10-02 18:04:08

+0

這不起作用。當我試圖執行isConnectivityOn(上下文)的斷點代碼時,它顯示錯誤的其他部分作爲非可執行代碼 – Akshay 2014-10-02 18:47:03

相關問題