2014-10-02 5 views
-3

У меня есть активность, показывающая категории мест в виде списка. Когда я пытаюсь нажать на элемент списка, приложение рушится из-за исключения NullPointerException. Ниже активностьКак решить 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; 
    } 
} 

Из ошибок я узнал, что мой Apdater получение «nameAddressList» в нуль, так как код в doInBakground не выполняется. Поэтому он бросает 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

Вы понимаете, что при добавлении данных данные равны нулю, поскольку он еще не был загружен фоновым потоком. Вы знаете, как работает нить? Вам нужно заполнить список в потоке ПОСЛЕ того, как данные были загружены. –

+0

@Pedro Oliveria Я никогда не работал до Async Tasks and Threading. Не могли бы вы рассказать мне, как это кодировать. Спасибо – Akshay

+0

nameAddressList имеет значение null, если вы не переходите в условие else; возможно, вы ошибаетесь. – duffymo

ответ

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(); этот оператор вызовет ваш класс async, в котором вы в конечном счете вызываете веб-службу и привязываете данные к списку, эта операция должна выполняться в другом потоке.

После завершения этого метода класса async с длинной задачей 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), давая ошибку «Класс» android.content.Context 'не загружен ». Таким образом, это не будет еще условие – Akshay

+0

Может быть, ваша функция использует контекст, поэтому я обновил свой ответ и поставил контекст внутри async. – Chitrang

+0

Это не работает. когда я пытаюсь выполнить код с точками останова для isConnectivityOn (контекст), он показывает ошибку на другой части как не исполняемый код – Akshay

Смежные вопросы