Исключение ArrayAdapter.getCount() NullPointerException

#android

#Android

Вопрос:

У меня есть следующий код в моем приложении для Android:

    protected ArrayList<String> message;

   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.where_to_go);

      whereToGoField = (AutoCompleteTextView)findViewById(R.id.WhereToGoField);

      adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line);
      whereToGoField.addTextChangedListener(whereToGoFieldInputWatcher);
      whereToGoField.setAdapter(adapter);
   }


   TextWatcher whereToGoFieldInputWatcher = new TextWatcher() {
      public void onTextChanged(final CharSequence s, int start, int before, int count) {
         Thread t = new Thread() {
            public void run() {
               Object o = Server.getStreetSuggestions(s.toString());
               if (o!=null) {
                  message = (ArrayList<String>)o;
               }
               messageHandler.sendEmptyMessage(0);
            }
         };
         t.start();
      }

   };

   private Handler messageHandler = new Handler() {
      public void handleMessage(Message msg) {
         adapter.clear();
          for(int i=0; i<message.size();   i){
              adapter.add(message.get(i));
          }
          adapter.notifyDataSetChanged();
      }
   };
  

В основном он получает ответ от моего сервера и заполняет этот ответ в autocompletetextview.

Но несколько раз я получаю следующую ошибку:

 04-25 16:08:42.288: ERROR/AndroidRuntime(6193): FATAL EXCEPTION: main
04-25 16:08:42.288: ERROR/AndroidRuntime(6193): java.lang.NullPointerException
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):     at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:322)
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):     at android.widget.AdapterView.checkFocus(AdapterView.java:720)
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):     at android.widget.AdapterView$AdapterDataSetObserver.onInvalidated(AdapterView.java:844)
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):     at android.database.DataSetObservable.notifyInvalidated(DataSetObservable.java:74)
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):     at android.widget.BaseAdapter.notifyDataSetInvalidated(BaseAdapter.java:85)
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):     at android.widget.ArrayAdapter$ArrayFilter.publishResults(ArrayAdapter.java:500)
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):     at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:313)
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):     at android.os.Handler.dispatchMessage(Handler.java:130)
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):     at android.os.Looper.loop(Looper.java:154)
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):     at android.app.ActivityThread.main(ActivityThread.java:4668)
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):     at java.lang.reflect.Method.invokeNative(Native Method)
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):     at java.lang.reflect.Method.invoke(Method.java:552)
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:917)
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674)
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):     at dalvik.system.NativeStart.main(Native Method)
  

Я не могу понять, откуда это взялось.

Не могли бы вы, пожалуйста, помочь мне с этим?

Ответ №1:

Посмотрим, поможет ли это (добавить setNotifyOnChange ):

 private Handler messageHandler = new Handler() {
      public void handleMessage(Message msg) {
         adapter.setNotifyOnChange(false); //stop notification while adding data
         adapter.clear();
          for(int i=0; i<message.size();   i){
              adapter.add(message.get(i));
          }
          adapter.notifyDataSetChanged();
      }
   };
  

Ответ №2:

Это то, что я сделал:

    TextWatcher whereToGoFieldInputWatcher = new TextWatcher() {
      public void onTextChanged(final CharSequence s, int start, int before, int count) {
         new AsyncTask<Integer, Void, ArrayList<String>> () {

            @Override
            protected synchronized void onPostExecute(ArrayList<String> result) {
                //make arrayAdapter from result
                //set adapter to AutoCompleteTextView
                adapter.clear();
                for (String name : result) {
                   adapter.add(name);
                }
                adapter.notifyDataSetChanged();
            }

            @Override
            protected ArrayList<String> doInBackground(Integer... params) {
               // make connection to remote server
               // retrive response from remote server
               // make arrayList from response
               return Server.getSuggestions(s.toString());
            }
        }.execute(1);
      }

      @Override
      public void afterTextChanged(Editable arg0) {
         // TODO Auto-generated method stub

      }

      @Override
      public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
         // TODO Auto-generated method stub

      }
   };
  

И похоже, что это работает.