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 / AndroidRuntime (5176): Auslöser: java.lang.RuntimeException: Es kann kein Handler in einem Thread erstellt werden, der Looper.prepare () nicht aufgerufen hat.
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
android
runtimeexception
lacas
quelle
quelle
Antworten:
Der Fehler ist selbsterklärend ...
doInBackground()
läuft auf einem Hintergrund-Thread, der, da er nicht als Schleife gedacht ist, nicht mit a verbunden istLooper
.Sie möchten höchstwahrscheinlich überhaupt keinen Handler direkt instanziieren ... unabhängig davon, welche Daten Ihre
doInBackground()
Implementierung zurückgibt, werden dieseonPostExecute()
an den UI-Thread ausgeführt.HINZUGEFÜGT NACH DER IN FRAGE ERSCHEINENDEN STACKTRACE:
Sieht so aus, als würden Sie versuchen, einen
AsyncTask
von einem GL-Rendering-Thread aus zu starten. Tun Sie das nicht, denn sie werden es auch nie tunLooper.loop()
. 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,
Activity.runOnUiThread()
mit einem Anruf anzurufenRunnable
, der Ihren Startschuss gibtAsyncTask
.quelle
Alle obigen Antworten sind richtig, aber ich denke, dies ist das einfachste mögliche Beispiel:
Dadurch wird ein Fortschrittsbalken im UI-Thread von einem völlig anderen Thread aktualisiert, der über die post () -Methode des in der Aktivität deklarierten Handlers übergeben wird.
Ich hoffe es hilft!
quelle
Auf diese Weise erstellen Sie einen Handler im Hintergrund-Thread
quelle
removeCallbacks
undquit
wannWork
dies getan wird, aber keine Verzögerung erreicht wird. Weil die Arbeit länger dauern kann als diese vordefinierte Verzögerung.Activity.runOnUiThread()
funktioniert bei mir nicht Ich habe dieses Problem umgangen, indem ich auf diese Weise einen regulären Thread erstellt habe:und rufen Sie es vom GL-Update folgendermaßen auf:
quelle
Versuchen Sie, Ihre asyntask über den UI-Thread auszuführen. Ich war mit diesem Problem konfrontiert, als ich nicht dasselbe tat!
quelle
Versuche dies
quelle