Aprender a pensar en términos de eventos es de hecho la clave aquí puede hacerlo :)
la primera regla es:.. nunca se detendrá el hilo de interfaz de usuario. El hilo de la interfaz de usuario es responsable de mantener tu aplicación sensible. Cualquier trabajo que hagas allí no debería bloquear; haz lo que tienes que hacer y regresa lo más rápido posible. Definitivamente evite hacer E/S en el hilo de la interfaz de usuario. (Hay algunos lugares donde no puede ayudarlo debido a los requisitos del ciclo de vida, por ejemplo, guardar el estado de la aplicación en). Si alguna vez llama al Thread.sleep
en el hilo de la interfaz de usuario, lo está haciendo mal.
Android hace cumplir esto con el error "Aplicación que no responde" (o "ANR") que ve el usuario. Cada vez que vea esto en una aplicación de Android, significa que el desarrollador hizo algo que provocó que el hilo de la interfaz de usuario se detuviera por mucho tiempo. Si el dispositivo está realmente empantanado por alguna razón, este error podría no ser culpa del desarrollador de la aplicación, pero generalmente significa que la aplicación está haciendo algo mal.
Puede utilizar este modelo para su ventaja mediante la publicación de sus propios eventos. Esto le brinda una manera fácil de decirle a su aplicación, "haga esto más tarde". En Android, la clave para publicar sus propios eventos está en la clase Handler
. El método postDelayed
le permite programar un Runnable
que se ejecutará después de un cierto número de milisegundos.
Si usted tiene una actividad que se ve algo como esto:
public class MyActivity extends Activity {
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandler.postDelayed(new Runnable() {
public void run() {
doStuff();
}
}, 5000);
}
private void doStuff() {
Toast.makeText(this, "Delayed Toast!", Toast.LENGTH_SHORT).show();
}
}
Luego de 5 segundos después de crear la actividad verá la tostada creada en doStuff
.
Si está escribiendo un View
personalizado es aún más fácil. Las vistas tienen su propio método postDelayed
que hará que todo se publique correctamente en el Handler
y no es necesario que crees el tuyo propio.
La segunda regla es: Vistas deben única ser modificados en el subproceso de interfaz de usuario. Esas excepciones que estás recibiendo e ignorando significan que algo salió mal y si las ignoras, es probable que tu aplicación comience a portarse mal de maneras interesantes. Si su aplicación hace la mayor parte de su trabajo en otros hilos, puede post
eventos directamente a la vista que desea modificar para que las modificaciones se ejecuten correctamente.
Si tiene una referencia a su Activity
de esa parte de su código, también puede usar Activity#runOnUIThread
, que hace exactamente lo que su nombre indica. Es posible que prefiera este enfoque si publicar en una sola vista no tiene sentido en contexto.
En cuanto a las actualizaciones de las vistas que no aparecen hasta que presionas un botón, ¿qué tipo de vistas son estas? ¿Son vistas personalizadas que dibujan estas actualizaciones? Si es así, ¿recuerda llamar al invalidate
después de que los datos cambien para activar el redibujado? Las vistas solo se vuelven a dibujar después de haber sido invalidadas.
Bueno, veo el error de mis maneras es que estoy tratando de modificar las vistas en un hilo diferente que se ejecuta constantemente para que la interfaz de usuario no se bloquee ... ya que no estoy seguro de cómo pasar los valores generados por mi hilo en funcionamiento ... a la interfaz de usuario. Aunque fue una respuesta increíblemente útil, y le agradezco mucho por ello –
Use un AsyncTask – Falmarri