私にはアクティビティがあり、その点でクラスがあります。
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) {
}
}
私は得る:
エラー/ 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()
実装が返すデータは、UIスレッドで実行されるonPostExecute()
に渡されます。
mActivity = ThisActivity.this;
mActivity.runOnUiThread(new Runnable() {
public void run() {
new asyncCreateText().execute();
}
});
質問に表示されるスタックトレースの後に追加:
GLレンダリングスレッドからAsyncTask
を開始しようとしているように見えますが、Looper.loop()
でもないことをしないでください。 AsyncTasksは、実際にはUIスレッドからのみ実行されるように設計されています。
最も破壊的な修正は、おそらくRunnable
を使用してAsyncTask
を開始するActivity.runOnUiThread()
を呼び出すことです。
上記の答えはすべて正しいですが、これは可能な限り簡単な例だと思います。
public class ExampleActivity extends Activity {
private Handler handler;
private ProgressBar progress;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
progress = (ProgressBar) findViewById(R.id.progressBar1);
handler = new Handler();
}
public void clickAButton(View view) {
// Do something that takes a while
Runnable runnable = new Runnable() {
@Override
public void run() {
handler.post(new Runnable() { // This thread runs in the UI
@Override
public void run() {
progress.setProgress("anything"); // Update the UI
}
});
}
};
new Thread(runnable).start();
}
}
これは、アクティビティで宣言されたハンドラーのpost()メソッドを介して渡されるまったく異なるスレッドからUIスレッドの進行状況バーを更新します。
それが役に立てば幸い!
この方法でバックグラウンドスレッドでハンドラーを作成します
private void createHandler() {
Thread thread = new Thread() {
public void run() {
Looper.prepare();
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// Do Work
handler.removeCallbacks(this);
Looper.myLooper().quit();
}
}, 2000);
Looper.loop();
}
};
thread.start();
}
Activity.runOnUiThread()
は機能しません。この問題を回避するには、次の方法で通常のスレッドを作成します。
public class PullTasksThread extends Thread {
public void run () {
Log.d(Prefs.TAG, "Thread run...");
}
}
GL updateから呼び出すと、次のようになります。
new PullTasksThread().start();
UIスレッドからasynctaskを実行してみてください。私は同じことをしていないときにこの問題に直面しました!
これを試して
Handler mHandler = new Handler(Looper.getMainLooper());
mHandler.post(new Runnable() {
@Override
public void run() {
//your code here that talks with the UI level widgets/ try to access the UI
//elements from this block because this piece of snippet will run in the UI/MainThread.
}
});