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 –


 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 🙂

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.

  • GreenBroot EventBus no pudo enviar el evento
  • ¿Por qué estoy recibiendo: threadid = 3: reaccionar a la señal 3 y congelación de juego (AndEngine)?
  • Cómo actualizar barra de progreso mediante el tema
  • Caso de interés en multithreading con int volátil
  • Prioridad de hilo: 'prueba de unidad'
  • Ejemplo de comunicación con HandlerThread
  • Cargando imagen de forma sincrónica con Glide
  • Android: ¿Qué hilo llama .onSensorChanged?
  • Asyntask: ¿por qué actualizar el hilo de la interfaz de usuario en doInbackground se encontrará con el error?
  • Android SDK AsyncTask doInBackground no está en ejecución (subclase)
  • Obtener el controlador devolver null en LooperThread
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.