Не могу создать обработчик внутри потока, который не называется лупер.подготовить()
У меня есть деятельность, и в этом у меня есть класс.
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.ленг.RuntimeException: не удается создать обработчик внутри потока, который не вызвал Looper.подготовьте ()
как я могу справиться с этой ошибкой?
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
6 ответов:
ошибка не требует пояснений...
doInBackground()выполняется в фоновом потоке, который, поскольку он не предназначен для цикла, не подключен кLooper.вы, скорее всего, не хотите напрямую создавать экземпляр обработчика вообще... какие бы данные ваши
doInBackground()возврат реализации будет передан вonPostExecute(), который работает в потоке пользовательского интерфейса.mActivity = ThisActivity.this; mActivity.runOnUiThread(new Runnable() { public void run() { new asyncCreateText().execute(); } });ДОБАВЛЕНО ПОСЛЕ STACKTRACE, ПОЯВЛЯЮЩЕГОСЯ В ВОПРОСЕ:
похоже, что вы пытаетесь начните
AsyncTaskиз потока рендеринга GL... не делайте этого, потому что они никогда не будутLooper.loop()либо. AsyncTasks действительно предназначены для запуска только из потока пользовательского интерфейса.наименее разрушительным решением, вероятно, было бы позвонить
Activity.runOnUiThread()СRunnableэто стартует вашAsyncTask.
все ответы выше правильные, но я думаю, что это самый простой пример:
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 () обработчика, объявленного в действии.
надеюсь, что это помогает!
создать обработчик в фоновом потоке таким образом
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 таким образом:
new PullTasksThread().start();
попробуйте запустить asyntask из потока пользовательского интерфейса. Я столкнулся с этой проблемой, когда я не делал то же самое!
попробуй такое
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. } });
Comments