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:
- Enviar objeto como parcela (con descriptores de archivo) a través de la intención provoca una excepción
- Java.lang.RuntimeException: Error al entregar el resultado ResultInfo {who = null, request = 1, result = -1, data = intention} a la actividad
- Error de inicio del error mediarecording de Android -19 runTimeException
- Mostrar / ocultar el elemento en la barra de acciones Android (3.0+)
- "RuntimeException: tipo de letra nativo no se puede hacer" al cargar la fuente
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
- La aplicación de Android falla al cargarse en algunos teléfonos en PathClassLoader
- Error al inflacionar la clase android.support.design.widget.FloatingActionButton
- La aplicación de Android se bloquea en la generación de versiones con el uso de Proguard y Dagger
- Java.lang.RuntimeException: No se puede instanciar el servicio .GCMIntentService
- Excepción de tiempo de ejecución extra cuando se ejecuta una aplicación de Android en algunos dispositivos
- "RuntimeException: Realizar una pausa de actividad que no se reanuda"
- Android 1.6: "android.view.WindowManager $ BadTokenException: No se puede agregar ventana-token null no es para una aplicación"
- ¿Por qué androide logcat no muestra el seguimiento de la pila para una excepción de tiempo de ejecución?
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 } });
- ¿Tiene Android XML Layout 'include' Tag realmente funciona?
- Error de Eclipse DDMS "No se puede vincular a local 8600 para depurador"