Actualizaciones de interfaz de usuario de subprocesos en Android
Acabo de empezar con el desarrollo de Android y la actualización de la interfaz de usuario es realmente me molesta: /
Esto es lo que tengo trabajando hasta ahora –
- Androide modificar el texto EditarTexto
- Llamar stopSelf () en servicio mientras el subproceso está en ejecución
- Hilos y uso de tareas Asynctask para httppost
- OnPostExecute () de AsyncTask nunca se llama en AndroidTestCase
- RxJava Multithreading con Realm - Acceso al dominio desde un subproceso incorrecto
Paquete projects.Move; Import android.os.Bundle; Import android.view.View; Import android.app.Activity; Import android.content.Context; Import android.graphics.Canvas; Import android.graphics.Paint; Import android.graphics.Color; Public class Move extends Actividad { Float privado y = 0; Privado ahora = 0; Float privado = 75; Pintura de pintura privada = pintura nueva (); @Anular Protected void onCreate (Paquete savedInstanceState) { Super.onCreate (savedInstanceState); SetContentView (nuevo SimpleMotion (este)); Paint.setColor (Color.BLACK); } Clase privada SimpleMotion extends View { Public SimpleMotion (Contexto contextual) { Super (contexto); } @Override protected void onDraw (Lienzo lienzo) { Float x = canvas.getWidth () / 2; Canvas.drawColor (Color.WHITE); Canvas.drawCircle (x, y, 30, pintura); If (System.currentTimeMillis () - ahora> delay) y ++; invalidar(); } } }
Funciona bien, pero todo el mundo dice que hacer los gráficos en el hilo principal, por lo que estoy tratando (y no) para pasar a otro hilo. El problema es que no tengo ni idea de cómo desde que realmente nunca he usado hilos.
Los ejemplos que Google da sobre el uso de Threads no parece ser muy claro y no podía seguirlo para lo que quiero hacer. ¿Podría pedir a alguien aquí para que me dé el ejemplo más básico de cómo podría hacer lo que estoy haciendo aquí de manera eficiente utilizando Threads?
Gracias por adelantado 🙂
- SDK de Android: ejecuta funciones en segundo plano
- Android de larga duración 'servicio'
- Android: Sincronización con el subproceso de procesador de OpenGL
- ¿El mejor método para roscar en Android?
- Error de Android Studio: "El método getText () debe ser llamado desde el subproceso de interfaz de usuario, el subproceso inferido actualmente es el trabajador
- ¿Cómo probar mejor el código Looper y Handler de la unidad en Android?
- NullPointerException: lock == null
- Cómo pausar y reanudar un subproceso de surfaceView
Bueno, supongo que hay algo de confusión aquí. Tienes que hacer tus actualizaciones GUI desde el hilo principal (también llamado el hilo GUI) – de lo contrario bien obtener algo así como "Excepción, blabla ha filtrado una vista".
Supongo que lo que han malentendido es que las operaciones costosas, como la creación de redes, deben hacerse en un hilo diferente que el hilo principal. Y si desea actualizar la interfaz gráfica de usuario desde el hilo de red que haría como ArtWorkAD dice (o sus enlaces dice).
Así que para lo que quieres hacer, puedes lograr algo como reemplazar tu clase SimpleMotion por lo siguiente:
private class SimpleMotion extends View { public SimpleMotion(Context context) { super(context); new Thread(new Runnable() { public void run() { while(true){ try { Thread.sleep(75); y++; postInvalidate(); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } @Override protected void onDraw(Canvas canvas) { float x = canvas.getWidth() / 2; canvas.drawColor(Color.WHITE); canvas.drawCircle(x, y, 30, paint); // if(System.currentTimeMillis() - now > delay) y++; // invalidate(); } }
Con su antiguo código de tener invalidate()
en onDraw()
, continuamente estaría redibujando el gui aunque no haya ningún cambio en él.
La parte importante del nuevo código es postInvalidate()
. Esto hace posible que el hilo GUI – de otro hilo – para volver a dibujar la GUI.
Puede utilizar AsyncTask para roscar, aspectos básicos: roscado sin dolor , ejemplo: Multithreading para rendimiento .
Para actualizar la interfaz de usuario, utilice los controladores de actualización, eche un vistazo a esto . Cada vez que quieras actualizar la interfaz de usuario, envías un mensaje desde el hilo a tu hilo principal de ui.
Bueno, la primera pregunta es – ¿por qué quieres hacer tus gráficos en un hilo separado? Porque a menos que usted está haciendo algunas cosas específicas (sobre todo en el reino de los juegos o los medios de comunicación), usted va a encontrarse en un montón de dolor con poco beneficio si se intenta hacer eso.
Es posible que termine con un montón de llamadas innecesarias a invalidate () (y, por tanto, redibuja) con el código que proporciona. Sería mejor activar el cambio del parámetro y (y el invalidar) con un manejador, que también puede disparar retardado.
- Buenas Prácticas: Validación de Entradas (Android)
- ¿Podemos crear new_strings.xml con strings.xml en la carpeta de valores para sting strings (Android)?