studio programacion herramientas fundamentos con avanzado aplicaciones android multithreading custom-view

programacion - manual de android en pdf



¿Puede una vista personalizada saber que se ha llamado a onPause? (5)

Sí, puedes usar el código de abajo,

@Override protected void onVisibilityChanged(@NonNull View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); if (visibility == View.VISIBLE) //onResume called else // onPause() called } @Override public void onWindowFocusChanged(boolean hasWindowFocus) { super.onWindowFocusChanged(hasWindowFocus); if (hasWindowFocus) //onresume() called else // onPause() called } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); // onDestroy() called } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); // onCreate() called }

Tengo una vista personalizada que ejecuta una operación de subproceso que se basa en realizar llamadas a las interwebs periódicamente. Me gustaría saber si hay una forma para que no tenga que eliminar ese hilo de la actividad principal (onPause) para que el hilo no se mueva en segundo plano después de que la actividad haya sido procesada (y / o eliminada).

La intención aquí es que la Vista personalizada sea autosuficiente y no necesite un manejo adicional de la Actividad. La forma de hacerlo sería que escuchara cuando su padre estaba en segundo plano y luego dejaría que el ciclo de sueño infinito en el subproceso expirara. No veo una manera de hacer eso, pero espero que esté pasando por alto algo.


No, a menos que usted lo notifique directamente.

Para su propósito, anule View.onDetachedFromWindow() y renuncie a su Thread allí. Luego, cuando la vista vuelva a estar visible, View.onAttachedToWindow() girar el hilo de nuevo en View.onAttachedToWindow() . El problema con onPause () y onResume () es que todavía puede tener una vista que está visible en la pantalla, pero que se adjunta a una actividad en pausa. Un ejemplo de cuándo puede suceder esto es si tiene una Actividad en una ventana que se superpone a otra.

O, como lo sugiere william gouvea, un Fragmento podría ser más adecuado para su propósito ya que ya tiene los ganchos del ciclo de vida para pausar y reanudar, y cualquier cosa que se comunique con la red realmente cae en el ámbito del controlador de todos modos.


O bien, debe hacer saber a su vista que la Actividad propietaria ya no está en primer plano o sondear el sistema con algún método para consultar qué tarea está actualmente en primer plano, lo que parece altamente ineficiente.

Aquí hay dos enlaces que han abordado este problema:

(Esto podría no ser realmente una respuesta, pero era demasiado grande para un comentario)


Sí tu puedes. Todo lo que necesita es tener un campo de tipo LifecycleOwner. Más sobre esto en la documentación oficial . En mi caso, creé una vista personalizada con otra vista de la biblioteca de terceros: CameraView.

Al principio, la vista personalizada necesita implementar la interfaz LifecycleOberver

public class MakePhotoView extends ConstraintLayout implements LifecycleObserver

Entonces, tengo un campo en mi vista personalizada:

private LifecycleOwner mLifecycleOwner;

Lo paso en el constructor como uno de los parámetros:

public MakePhotoView(Context context, OnPhotoMadeListener onPhotoMadeListener, LifecycleOwner lifecycleOwner) { super(context); mOnPhotoMadeListener = onPhotoMadeListener; mLifecycleOwner = lifecycleOwner; init(); }

Después de eso, registro mi vista personalizada como observador de eventos del ciclo de vida en LifecycleOwner:

private void init() { //other code mLifecycleOwner.getLifecycle().addObserver(this); }

Y finalmente puedo escuchar los eventos del ciclo de vida:

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME) public void startCamera() { AppLog.logObject(this, "On Resume called for MakeCameraView"); mCameraView.start(); } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) public void stopCamera() { AppLog.logObject(this, "On Pause called for MakeCameraView"); mCameraView.stop(); } @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) public void destroyCamera() { AppLog.logObject(this, "On Destroy called for MakeCameraView"); mCameraView.destroy(); }


Si simplemente anula la clase de Vista y crea su propia Vista Personalizada, puede crear una interfaz para actuar como un oyente, que debe ser implementado por su actividad principal, de modo que cuando sucede algo, desencadena el evento y establece la comunicación entre esos componentes. .

Dependiendo de lo que quiera lograr, los Fragmentos podrían ser útiles ya que este componente tiene su propio ciclo de vida similar a la actividad (onPause / onResume por ejemplo), mantiene su propio estado, tiene o no una vista y puede mantener su estado entre cambios de configuración.

Vea más en: http://developer.android.com/reference/android/app/Fragment.html http://developer.android.com/guide/components/fragments.html