2017-01-12 1 views
0

Ich würde gerne eine große Anzahl von Add Delete Berechnungsarbeit auf den Worker-Thread, notifyDataSetChanged Arbeit auf dem ui-Thread setzen. Auf der Grundlage davon, um die java.lang.IllegalStateException zu vermeiden. Ausnahme wie folgt: java.lang.IllegalStateException: Der Inhalt des Adapters wurde geändert, aber ListView hat keine Benachrichtigung erhalten. Stellen Sie sicher, dass der Inhalt Ihres Adapters nicht von einem Hintergrundthread geändert wird, sondern nur vom UInthread. Stellen Sie sicher, dass Ihr Adapter notifyDataSetChanged() aufruft, wenn sich der Inhalt ändert.java.lang.IllegalStateException: Der Inhalt des Adapters wurde geändert, aber ListView hat keine Benachrichtigung erhalten.

Code Kurzschrift wie:

new Thread(){ 
      @Override 
      public void run() { 
       for(int i=0; i<5000; i++){ 
        mDatas.add(i); 
       } 
       mActivity.runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         mAdapter.notifyDataSetChanged(); 
        } 
       }); 
      } 
     }.start(); 

ich für eine lange Zeit auf Netto-bin auf der Suche. Aber keine Verwendung. Bitte helfen oder versuchen Sie, einige Ideen zu geben, wie dies zu erreichen ist.

+0

Mögliche Duplikat http://stackoverflow.com/questions/3132021/android-listview-illegalstateexception-the-content-of-the-adapter-has-changed –

+0

was ist mAcitvity? –

+0

Sie können auch versuchen, Daten und * notifyDataSetChanged * im * UI-Thread * hinzuzufügen. –

Antwort

0

Es gibt zwei Lösungen, die damit zu überwinden sind.

1) Verwenden Sie AsyncTask und aktualisieren Sie Ihren Adapter in onPostExecute() Methode.

@override 
protected void onPostExecute(String result) { 
    mAdapter.notifyDataSetChanged(); 
} 

2) Verwenden Sie Handler mit Thread Nachricht registrieren und in handleMessage() Ihren Adapter aktualisieren.

new Thread(){ 
     @Override 
     public void run() { 

        handler.sendEmptyMessage(0); 
       } 
      }); 
     } 
    }.start(); 

Handler handler = new Handler(new Handler.Callback() { 
     @Override 
     public boolean handleMessage(Message message) { 
      mAdapter.notifyDataSetChanged(); 
      return false; 
     } 
    }); 
+0

Sie haben vielleicht meine Frage nicht gelesen, egal wie oder danke – yulongzou

0

Sie Artikel hinzufügen, in nicht-UI-Thread zu Arraylist und notifyDataSetChanged auf dem UI-Thread

new Thread(){ 
      @Override 
      public void run() { 

       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         for(int i=0; i<5000; i++){ 
          mDatas.add(i); 
         } 
         mAdapter.notifyDataSetChanged(); 
        } 
       }); 
      } 
     }.start(); 
+0

Eine große Anzahl von Operationen im UI-Thread wird Leistungsprobleme wie UI-Karte Dayton haben. – yulongzou

+0

rufen Sie 'mAdapter.notifyDataSetChanged()' von jedem Hintergrunddienst? Wenn es von Aktivität/Fragment ist, brauchen Sie nicht die ganze runOnUiThread-Sache –

+0

es ist von Dialog, der mAdapter.notifyDataSetChanged() aufruft. – yulongzou

0

dieses

Überprüfen Sie, ob mActivity null Versuchen Aufruf ist oder nicht, bevor runOnUi Faden

Aufruf
new Thread(){ 
       @Override 
       public void run() { 
        for(int i=0; i<5000; i++){ 
         mDatas.add(i); 
        } 
        if(mActivity!=null){ 
        mActivity.runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          mAdapter.notifyDataSetChanged(); 
         } 
        }); 
        } 
       } 
     }.start(); 
+0

Danke, dass du auf das Problem mit meinem Code hingewiesen hast. Und ich konzentriere mich auf die oben genannten Probleme. – yulongzou

+0

Jederzeit! Upvote meine Antwort, damit andere es beziehen können –

+0

Entschuldigung, ich hoffe, dass ich für Sie upvote, aber meine Ehre ist weniger als fünfzehn. – yulongzou

Verwandte Themen