CalledFromWrongThreadException: Nur der ursprüngliche Thread, der eine Ansichtshierarchie erstellt hat, kann Ansichten berühren

Ich habe ein Problem mit dem folgenden Fehler in Android:

CalledFromWrongThreadException ;: Nur der ursprüngliche Thread, der eine View-Hierarchie erstellt hat, kann seine Ansichten berühren

  • Cordova App, die keine Push-Benachrichtigungen verwendet: "Fehlende Push-Benachrichtigung Berechtigung"
  • Unzulässige Zugriffsausnahme mit LocalStorage auf Android Lebkuchen
  • Verwenden Sie GPS und Netzwerk Provider zur gleichen Zeit in Android
  • Effizienter Weg, um einen Ton zu spielen, wenn die Schaltfläche geklickt wird
  • Was ist der Unterschied zwischen Android-Benutzer und Linux-Root-Benutzer
  • RemotePlaybackClient, stop () nicht Rückruf
  • Es scheint, wenn ich versuche, eine Textansicht in meiner Aktivität zu aktualisieren, ist der Aufruf zur Aktualisierung der TextView aus meiner Aktivität, aber ich bekomme immer noch den obigen Fehler.

    Ich habe es so:

    OnCreate () – setzt die Schaltflächen und die Textansicht ein.

    OnStateChange () – ein Zuhörer für Benachrichtigungen über Statusänderungen, wenn dies Benachrichtigung erhält, wenn der TextView geändert wird, um einen anderen Text zu sagen.

    Wenn ich Benachrichtigung über einen neuen Text bekomme, versuche ich, die TextView so zu ändern:

    ((TextView)findViewById(R.id.title)).setText("Some Text"); 

    Aber ich bekomme den obigen Fehler.

    Von googeln es, scheint es, ich sollte einen Handler verwenden, um die TextView ändern oder vielleicht verwenden AsyncTask?

    Könnte jemand erklären, welche wäre besser zu bedienen und warum?

    EDIT: ADDED CODE SNIPPETS:


      public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.my); getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.my_title); ((TextView)findViewById(R.id.time)).setText("Hello Text"); findViewById(R.id.keyboardimage).setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent dialIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:")); startActivity(dialIntent); dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.FLAG_SOFT_KEYBOARD)); dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK)); } }); } 

     //CallBacks from running Service private final ICallDialogActivity.Stub iCallDialogActivity = new ICallDialogActivity.Stub(){ @Override public void onStateChanged(int callState) throws RemoteException { switch(callState){ case GlobalData.CALL_STATUS_IDLE: break; case GlobalData.CALL_STATUS_DISCONNECTING: byeSetup(); break; } }; 

     public void byeSetup(){ ((TextView)findViewById(R.id.time)).setText("Bye Text"); findViewById(R.id.keyboardimage).setOnClickListener(new OnClickListener() { public void onClick(View v) { //Void the Button }}); } 

  • Wie man Apk-Dateinamen in android ändert
  • So ändern Sie programmgesteuert Hintergrundfarbe der Aktionsleiste
  • Verwendung von AND und OR in SQLite
  • Unabhängigkeit für Segeltuchklassen Zeichnung Grundelemente
  • Live Testing der Android LVL
  • Android Appcompat v21 - Verwenden Sie alte Spinner-Stil
  • 4 Solutions collect form web for “CalledFromWrongThreadException: Nur der ursprüngliche Thread, der eine Ansichtshierarchie erstellt hat, kann Ansichten berühren”

    Schau, wie du auf dem falschen Faden bist. Versuchen Sie es mit einem Handler, die GUI auf dem rechten Thread zu aktualisieren. Siehe Handling Teure Operationen in der UI Thread Beispiel von android.com. Im Grunde würden Sie byeSetup in einem Runnable und es mit einer Handler Instanz aufrufen.

     Handler refresh = new Handler(Looper.getMainLooper()); refresh.post(new Runnable() { public void run() { byeSetup(); } }); 

    Für andere, ersetzen nur byeSetup (); Mit Ihren Code-Anweisungen oder Methoden. ByeSetup () ist eine Beispielmethode. Hoffe, es wird etwas Zeit sparen.

    Erweiterung auf die Antwort von cancodejavaforfood auf Klarheit und Umsetzung …

    Ich habe das zu arbeiten und unten ist, wie ich es gemacht habe. Ich laufe mehrere Verarbeitungs-Threads in einem Service, so dass andere Lösungen, die in Aktivität laufen nicht funktionieren, wie runOnUiThread (neue Runnable () {} …

    Setzen Sie dies an die Spitze Ihrer Service-Klasse, so dass es überall in dieser Klasse zugänglich ist:

     Handler handler; 

    Setzen Sie dies in Ihre Service-Klasse onCreate-Methode oder etwas, das auf Service-Haupt-Thread lädt

     handler= new Handler(Looper.getMainLooper()); 

    Setzen Sie diese in Ihrem zusätzlichen Thread zu 'Post zurück' Code, um in UI oder Service-UI laufen (was auch immer genannt):

     handler.post(new Runnable() { public void run() { playNext(); //or whatever method you want to call thats currently not working } }); 

    Ein weiterer Ansatz, diesmal Gebrauch von android.os.Message

    Habe android.os.Handler als Feld in deiner Aktivität definiert:

     private final Handler myTextHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message stringMessage) { textView.append((String) stringMessage.obj); return true; } }); 

    Dann füttere es von deinem anderen Thread wie folgt:

     Message stringMessage = Message.obtain(myTextHandler); stringMessage.obj = "Hello!"; stringMessage.sendToTarget(); 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.