studio - try catch android
No se puede crear el controlador dentro de la cadena que no ha llamado a Looper.prepare() (6)
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();
}
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 en el subproceso que no ha llamado a 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 se explica por sí mismo ... doInBackground()
ejecuta en un hilo de fondo que, dado que no está destinado a repetirse, no está conectado a un Looper
.
Lo más probable es que no desee instanciar directamente un controlador en absoluto ... los datos que doInBackground()
su implementación de doInBackground()
se pasarán a onPostExecute()
que se ejecuta en el hilo de la interfaz de usuario.
mActivity = ThisActivity.this;
mActivity.runOnUiThread(new Runnable() {
public void run() {
new asyncCreateText().execute();
}
});
AGREGADO SIGUIENDO EL STACKTRACE QUE APARECE EN LA PREGUNTA:
Parece que estás intentando iniciar una AsyncTask
partir de un hilo de renderizado GL ... no hagas eso porque tampoco lo harán nunca Looper.loop()
. AsyncTasks están realmente diseñados para ejecutarse solo desde el hilo de la interfaz de usuario.
La solución menos disruptiva sería llamar a Activity.runOnUiThread()
con un Runnable
que inicia su AsyncTask
.
Intenta ejecutarte asyntask desde el hilo de UI. ¡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 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.
}
});
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 hace esto es actualizar una barra de progreso en el hilo de la interfaz de usuario desde un hilo completamente diferente pasado a través del método post () del controlador declarado en la actividad.
¡Espero eso ayude!
Activity.runOnUiThread()
no funciona para mí. Trabajé alrededor de este problema creando un hilo regular de esta manera:
public class PullTasksThread extends Thread {
public void run () {
Log.d(Prefs.TAG, "Thread run...");
}
}
y llamándolo desde la actualización GL de esta manera:
new PullTasksThread().start();