Java.lang.RuntimeException: Kann kein Handler im Thread erstellen, das Looper.prepare () nicht aufgerufen hat.

Ich habe eine Android-App mit einem Thread. Ich möchte eine Toast-Nachricht mit einer Nachricht zu zeigen.

Wenn ich das mache, bekomme ich die folgende Ausnahme:

  • Intellij 13 Auto Doc Popup auf Mouseover-Lösung funktioniert nicht mehr
  • Vorschau auf horizontale recyclerview in android studio
  • Android-Kamera im Portrait auf SurfaceView
  • So fügen Sie Knopf tint programmgesteuert hinzu
  • Zeigen Sie einen Teil der Webseite auf dem Webview android an
  • Android: Klicken Sie auf Ereignis für Statusleiste Benachrichtigung
  • Logcat- Spur:

    FATAL EXCEPTION: Timer-0 java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() at android.os.Handler.<init>(Handler.java:121) at android.widget.Toast$TN.<init>(Toast.java:322) at android.widget.Toast.<init>(Toast.java:91) at android.widget.Toast.makeText(Toast.java:238) 

    Gibt es eine Arbeit für das Drücken von Toast-Nachrichten von Threads auf die Benutzeroberfläche?

  • Inferring Nullity läuft für immer
  • Android Plattenspielplatz Video
  • Wie man CA-Zertifikat programmgesteuert auf Android ohne Benutzerinteraktion installiert
  • Corona sdk Display Mehrzeilige Benachrichtigung
  • Wie kann ich einen Knopf zum Info-Fenster eines Markers hinzufügen?
  • Holen Sie sich Kontext in einem Service
  • 5 Solutions collect form web for “Java.lang.RuntimeException: Kann kein Handler im Thread erstellen, das Looper.prepare () nicht aufgerufen hat.”

    Ich habe diese Ausnahme bekommen, weil ich versuchte, ein Toast Popup aus einem Hintergrund-Thread zu machen.
    Toast braucht eine Aktivität, um auf die Benutzeroberfläche zu schieben und Threads haben das nicht.
    Also ein Workaround ist, um den Thread einen Link zu der übergeordneten Aktivität und Toast zu geben.

    Setzen Sie diesen Code in den Thread, wo Sie eine Toast-Nachricht senden möchten:

     parent.runOnUiThread(new Runnable() { public void run() { Toast.makeText(parent.getBaseContext(), "Hello", Toast.LENGTH_LONG).show(); } }); 

    Halten Sie einen Link zu der übergeordneten Aktivität im Hintergrund-Thread, der diesen Thread erstellt hat. Verwenden Sie die übergeordnete Variable in Ihrer Threadklasse:

     private static YourActivity parent; 

    Wenn Sie den Thread erstellen, übergeben Sie die übergeordnete Aktivität als Parameter über den Konstruktor wie folgt:

     public YourBackgroundThread(YourActivity parent) { this.parent = parent; } 

    Jetzt kann der Hintergrund-Thread Toast-Nachrichten auf den Bildschirm drücken.

    Android basiert grundsätzlich auf zwei Thread-Typen, nämlich UI-Thread und Hintergrund-Thread. Laut Android-Dokumentation –

    Nicht auf das Android-UI-Toolkit von außerhalb des UI-Threads zugreifen, um dieses Problem zu beheben, bietet Android mehrere Möglichkeiten, auf den UI-Thread aus anderen Threads zuzugreifen. Hier ist eine Liste von Methoden, die helfen können:

     Activity.runOnUiThread(Runnable) View.post(Runnable) View.postDelayed(Runnable, long) 

    Jetzt gibt es verschiedene Methoden, um dieses Problem zu lösen. Ich werde es durch Codebeispiel erklären

    RunOnUiThread

     new Thread() { public void run() { myactivity.this.runOnUiThread(new runnable() { public void run() { //Do your UI operations like dialog opening or Toast here } }); } }.start(); 

    LOOPER

    Klasse, die verwendet wird, um eine Nachrichtenschleife für einen Thread auszuführen. Threads haben standardmäßig keine Meldungsschleife, die mit ihnen verknüpft ist. Um einen zu erstellen, ruf prep vor () in den Thread, der die Schleife ausführen soll, und dann loop (), um es Prozess-Meldungen zu haben, bis die Schleife gestoppt wird.

     class LooperThread extends Thread { public Handler mHandler; public void run() { Looper.prepare(); mHandler = new Handler() { public void handleMessage(Message msg) { // process incoming messages here } }; Looper.loop(); } 

    AsyncTask

    Mit AsyncTask können Sie asynchrone Arbeiten an Ihrer Benutzeroberfläche durchführen. Es führt die Sperroperationen in einem Worker-Thread aus und veröffentlicht dann die Ergebnisse auf dem UI-Thread, ohne dass Sie selbst Threads und / oder Handler behandeln müssen.

     public void onClick(View v) { new CustomTask().execute((Void[])null); } private class CustomTask extends AsyncTask<Void, Void, Void> { protected Void doInBackground(Void... param) { //Do some work return null; } protected void onPostExecute(Void param) { //Print Toast or open dialog } } 

    Handler

    Mit einem Handler können Sie Message- und Runnable-Objekte, die mit der MessageQueue des Threads verknüpft sind, senden und verarbeiten.

     Message msg = new Message(); new Thread() { public void run() { msg.arg1=1; handler.sendMessage(msg); } }.start(); Handler handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { if(msg.arg1==1) { //Print Toast or open dialog } return false; } }); 

    Von http://developer.android.com/guide/components/processes-and-threads.html :

    Darüber hinaus ist das Android UI Toolkit nicht threadsicher. Also, du darfst deine Benutzeroberfläche nicht von einem Arbeitsthread manipulieren – du musst alle Manipulationen zu deiner Benutzeroberfläche aus dem UI-Thread machen. So gibt es einfach zwei Regeln für Android Single Thread-Modell:

    1. Blockiere den UI-Thread nicht
    2. Nicht auf das Android UI Toolkit von außerhalb des UI Thread zugreifen

    Du musst Müßiggang in einem Arbeiter-Thread erkennen und einen Toast im Haupt-Thread zeigen.

    Bitte posten Sie einen Code, wenn Sie eine ausführlichere Antwort wünschen.

    Nach Code-Publikation:

    In strings.xml

     <string name="idleness_toast">"You are getting late do it fast"</string> 

    In YourWorkerThread.java

     Toast.makeText(getApplicationContext(), getString(R.string.idleness_toast), Toast.LENGTH_LONG).show(); 

    Verwenden Sie AlertDialog nicht, treffen Sie eine Auswahl. AlertDialog und Toast sind zwei verschiedene Dinge.

    Hier ist was ich getan habe

      public void displayError(final String errorText) { Runnable doDisplayError = new Runnable() { public void run() { Toast.makeText(getApplicationContext(), errorText, Toast.LENGTH_LONG).show(); } }; messageHandler.post(doDisplayError); } 

    Das sollte die Methode von entweder Thread aufgerufen werden.

    Wo messageHandler in der Aktivität als ..

     Handler messageHandler = new Handler(); 

    Sie können einfach BeginInvokeOnMainThread () verwenden. Es ruft eine Aktion auf dem Gerät main (UI) Thread auf.

     Device.BeginInvokeOnMainThread(() => { displayToast("text to display"); }); 

    Es ist einfach und funktioniert perfekt für mich!

    EDIT: Arbeitet, wenn du C # Xamarin benutzt

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.