No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare ()

Tengo una Actividad, y en eso tengo una clase.

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

En mi DynamicText java Tengo este código:

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

Yo obtengo:

ERROR / AndroidRuntime (5176): Causado por: java.lang.RuntimeException: No se puede crear el controlador dentro del hilo que no ha llamado Looper.prepare ()

¿Cómo puedo manejar este error?

 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 

El error es auto-explicativo … doInBackground() ejecuta en un subproceso de fondo que, ya que no está destinado a bucle, no está conectado a un Looper .

Lo más probable es que no desee instanciar directamente un Handler en absoluto … cualquier dato que su implementación doInBackground() devuelva será pasado a onPostExecute() que se ejecuta en el subproceso de UI.

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

AÑADIDO DESPUÉS DEL STACKTRACE COMPARTIDO EN CUESTIÓN:

Parece que estás intentando iniciar un AsyncTask desde un hilo de renderizado GL … no hagas eso porque no lo harán Looper.loop() tampoco. AsyncTasks están realmente diseñados para ejecutarse desde el subproceso de interfaz de usuario.

La solución menos perjudicial probablemente sería llamar a Activity.runOnUiThread() con un Runnable que arranca tu AsyncTask .

Todas las respuestas anteriores son correctas, pero creo que este es el ejemplo más fácil posible:

 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(); } } 

Lo que esto hace es actualizar una barra de progreso en el subproceso de interfaz de usuario de un hilo completamente diferente que pasa a través del método post () del controlador declarado en la actividad.

¡Espero eso ayude!

Crea el controlador en el hilo de fondo de esta manera

 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() no funciona para mí. He trabajado alrededor de este problema mediante la creación de un hilo regular de esta manera:

 public class PullTasksThread extends Thread { public void run () { Log.d(Prefs.TAG, "Thread run..."); } } 

Y llamándolo de la actualización GL de esta manera:

 new PullTasksThread().start(); 

Intente ejecutar asyntask desde el subproceso de la interfaz de usuario. Me enfrenté a este problema cuando no estaba haciendo lo mismo!

Prueba esto

  Handler mHandler = new Handler(Looper.getMainLooper()); mHandler.post(new Runnable() { @Override public void run() { \\your code here } }); 
  • Android - FATAL EXCEPTION: main - No se puede iniciar la actividad ComponentInfo
  • ¿Qué está causando esto en android webView?
  • Error: Error de ejecución para la tarea ': app: transformClassesWithDexForDebug' en android studio
  • Android RuntimeException onCreateDialog no creó un diálogo para id
  • ¿Qué causa "RuntimeException: línea de archivo XML binario # 20: Debe proporcionar un atributo layout_height." (Se sospecha que ActionBarScherlock)?
  • BluetoothAdapter.getDefaultAdapter () lanzando RuntimeException mientras no está en Activity
  • Java.lang.RuntimeException: falló la toma de imagen
  • Java.lang.RuntimeException: No se puede inicializar el motor de efecto para type: 0bed4300-ddd6-11db-8f34-0002a5d5c51b Error: -3
  • La exención 'No se puede agregar ventana - token de Android' no es para una aplicación '
  • ¿Llamando startActivity () desde fuera de una Actividad?
  • Excepción: las devoluciones de llamada deben establecer los límites de los padres en populateNodeForVirtualViewId ()
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.