Es kann kein Handler innerhalb eines Threads erstellt werden, der keinen Looper aufgerufen hat.vorbereiten()

StackOverflow https://stackoverflow.com/questions/5009816

  •  14-11-2019
  •  | 
  •  

Frage

Ich habe eine Aktivität, und darin habe ich eine Klasse.

text=new Dynamictext(...);
text.setText("txt");

in meinem DynamicText Java habe ich diesen Code:

public void setText(String text) {
    this.text=text;
    new asyncCreateText().execute();
    //this.createText(text);
}

//private Handler handler = new Handler();

private class asyncCreateText extends AsyncTask<Void, Void, Void> 
{
    @Override
    protected Void doInBackground(Void... unused) {
        return null;
    }

    @Override
    protected void onPostExecute(Void unused) {

    }
}

Ich bekomme:

FEHLER / Androidlaufzeit (5176):Verursacht durch:Java.lang.Laufzeitexception:Es kann kein Handler innerhalb eines Threads erstellt werden, der keinen Looper aufgerufen hat.vorbereiten()

Wie kann ich mit diesem Fehler umgehen?

ERROR/AndroidRuntime(5370): java.lang.ExceptionInInitializerError
ERROR/AndroidRuntime(5370):     at com.l.start.DynamicText.setText(DynamicText.java:125)
ERROR/AndroidRuntime(5370):     at com.l.start.OpenGLRenderer.initfonts(OpenGLRenderer.java:168)
ERROR/AndroidRuntime(5370):     at com.l.start.OpenGLRenderer.init(OpenGLRenderer.java:119)
ERROR/AndroidRuntime(5370):     at com.l.start.OpenGLRenderer.onSurfaceChanged(OpenGLRenderer.java:90)
ERROR/AndroidRuntime(5370):     at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1120)
ERROR/AndroidRuntime(5370):     at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:975)

ERROR/AndroidRuntime(5370): Caused by: java.lang.RuntimeException: 
    Can't create handler inside thread that has not called Looper.prepare()
ERROR/AndroidRuntime(5370):     at android.os.Handler.<init>(Handler.java:121)
ERROR/AndroidRuntime(5370):     at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
ERROR/AndroidRuntime(5370):     at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
ERROR/AndroidRuntime(5370):     at android.os.AsyncTask.<clinit>(AsyncTask.java:152)
ERROR/AndroidRuntime(5370):     ... 6 more
War es hilfreich?

Lösung

Der Fehler ist selbsterklärend... doInBackground() läuft auf einem Hintergrundthread, der, da er keine Schleife ausführen soll, nicht mit einem verbunden ist Looper.

Höchstwahrscheinlich möchten Sie einen Handler überhaupt nicht direkt instanziieren...welche Daten auch immer Ihre doInBackground() Implementierungsrückgaben werden an übergeben onPostExecute() welches läuft auf dem UI-Thread.

   mActivity = ThisActivity.this; 

    mActivity.runOnUiThread(new Runnable() {
     public void run() {
     new asyncCreateText().execute();
     }
   });

HINZUGEFÜGT NACH DEM FRAGLICHEN STACKTRACE:

Sieht so aus, als ob Sie versuchen, eine zu starten AsyncTask aus einem GL-Rendering-Thread...tu das nicht, weil sie es nie tun werden Looper.loop() entweder.AsyncTasks sind wirklich so konzipiert, dass sie nur über den UI-Thread ausgeführt werden können.

Die am wenigsten störende Lösung wäre wahrscheinlich das Anrufen Activity.runOnUiThread() mit einem Runnable das startet deine AsyncTask.

Andere Tipps

Alle oben genannten Antworten sind korrekt, aber ich denke, das ist das einfachste Beispiel möglich: generasacodicetagpre.

Was dies dazu führt, dass ein Fortschrittsbalken im UI-Thread von einem völlig anderen Thread aktualisiert wird, der durch das post () Verfahren des in der Aktivität deklarierten Handlers geleitet wird.

hoffe es hilft!

Sie erstellen den Handler im Hintergrundgewinde auf diese Weise generasacodicetagpre.

Activity.runOnUiThread() funktioniert nicht für mich.Ich habe dieses Problem umgearbeitet, indem ich einen regelmäßigen Thread auf diese Weise erstellt habe: generasacodicetagpre.

und rufen Sie es aus dem GL auf diese Weise: generasacodicetagpre.

Versuchen Sie, Sie asynktask aus dem UI-Thread auszuführen.Ich hatte dieses Problem, als ich nicht dasselbe machte!

Versuchen Sie es mit generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top