es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo implementar el patrón observador en Android Studio?

Después de leer Headfirst design patterns quiero conocer la forma más sencilla de implementar un patrón de diseño observer en mi aplicación.

El contexto:

En la MainActivity de la aplicación, después de que los usuarios ingresen en EditTextView y hagan clic en el botón, se generará una URL y se enviará a otras actividades para su visualización.
(también cambia a otra actividad 1)

Quiero hacer que mi MainActivity sea el Sujeto(Observable) y Activity1 y Activity2 sean mis Observadores.

En lugar de utilizar la interfaz de observador integrada, intenté utilizar interfaces de sujeto y de observador definidas por mí para implementar este patrón(como lo hicieron en el libro).

Pero esta forma incluye la creación de una instancia de Sujeto en la clase de Observador, lo que significa que crearé una instancia de MainActivity en mis otras clases de Observador, no estoy seguro si funcionará, ¿alguien podría decirme cómo hacerlo correctamente?
(¿O simplemente no puedo utilizar una actividad como un sujeto?)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para implementar el patrón de diseño observer en tu aplicación de Android como se describe en el contexto, puedes seguir los siguientes pasos:

    1. Define una interfaz Subject que defina los métodos para registrar, eliminar y notificar observadores.
    public interface Subject {
        void registerObserver(Observer observer);
        void removeObserver(Observer observer);
        void notifyObservers(String url);
    }
    
    1. Define una interfaz Observer que defina el método de actualización que llamará el sujeto cuando su estado cambie.
    public interface Observer {
        void update(String url);
    }
    
    1. Implementa la interfaz Subject en tu clase MainActivity.
    public class MainActivity extends AppCompatActivity implements Subject{
        private List<observer> observers = new ArrayList<>();
    
        // Método para registrar observadores
        @Override
        public void registerObserver(Observer observer) {
            if (!observers.contains(observer)) {
                observers.add(observer);
            }
        }
    
        // Método para eliminar observadores
        @Override
        public void removeObserver(Observer observer) {
            if (observers.contains(observer)) {
                observers.remove(observer);
            }
        }
    
        // Método para notificar observadores con la nueva URL
        @Override
        public void notifyObservers(String url) {
            for (Observer observer : observers) {
                observer.update(url);
            }
        }
    
        // Método llamado cuando se hace clic en el botón para generar URL y notificar observadores
        public void onButtonClicked(View view) {
            String url = generateUrlFromEditText(); // puedes reemplazar este método con tu propia implementación
            notifyObservers(url);
            Intent intent = new Intent(this, Activity1.class);
            startActivity(intent);
        }
    }
    
    1. Implementa la interfaz Observer en tus clases Activity1 y Activity2.
    public class Activity1 extends AppCompatActivity implements Observer {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_1);
            // Registrarse como observador en MainActivity
            ((MainActivity)getApplicationContext()).registerObserver(this);
        }
    
        // Método de actualización llamado por el sujeto cuando cambia su estado
        @Override
        public void update(String url) {
            // Hacer algo con la nueva URL
            displayUrl(url);
            // Anular registro como observador cuando ya no se necesite
            ((MainActivity)getApplicationContext()).removeObserver(this);
        }
    }
    
    public class Activity2 extends AppCompatActivity implements Observer {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_2);
            // Registrarse como observador en MainActivity
            ((MainActivity)getApplicationContext()).registerObserver(this);
        }
    
        // Método de actualización llamado por el sujeto cuando cambia su estado
        @Override
        public void update(String url) {
            // Hacer algo con la nueva URL
            displayUrl(url);
            // Anular registro como observador cuando ya no se necesite
            ((MainActivity)getApplicationContext()).removeObserver(this);
        }
    }
    
    1. Finalmente, asegúrate de que eliminas el registro de los observadores del sujeto cuando ya no sean necesarios para evitar fugas de memoria. En la implementación de ejemplo anterior, los observadores se anulan ellos mismos cuando se llama al método de actualización.

Comments are closed.