1. ホーム
  2. android

[解決済み] Looper.prepare()が呼び出されていないスレッドでハンドラを作成することができない

2023-08-09 01:58:24

質問

アクティビティがあり、その中にクラスがあります。

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

をDynamicText javaの中に入れています。

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) {

    }
}

得ることができる。

ERROR/AndroidRuntime(5176): 原因:java.lang.RuntimeException: Looper.prepare()を呼び出していないスレッド内ではハンドラを作成できません。

このエラーはどのように処理すればよいのでしょうか。

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

どのように解決するのですか?

エラーは自明です... doInBackground() はバックグラウンドのスレッドで実行され、ループすることを意図していないので Looper .

ハンドラを直接インスタンス化する必要はないでしょう。 doInBackground() 実装が返すどのようなデータも onPostExecute() に渡され、UIスレッドで実行されます。

   mActivity = ThisActivity.this; 

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

の後に、問題のスタックトレースが表示されるようにしました。

を開始しようとしているように見えます。 AsyncTask を始めようとしているようです。 Looper.loop() にもならないからです。AsyncTasks は本当に UI スレッドからのみ実行されるように設計されています。

最も破壊的でない修正方法は、おそらく Activity.runOnUiThread()Runnable をキックオフし AsyncTask .