with studio priority overview open notification example custom anatomy activity android android-activity notify

android - studio - Cómo notificar una actividad cuando se cambian GlobalVariables



notification overview android (1)

Tengo una aplicación de Android que está conectada a la computadora a través de un cable USB. Yo uso una clase TCPServer para enviar mensajes y escuchar. Por ejemplo:

Cuando envío un mensaje como: solicitud: x
Obtengo la respuesta: respuesta: x: 55

Necesito hacer cambios en mi actividad de acuerdo con la respuesta que reciba. En este momento resolví temporalmente el problema pasando actividad y objeto de clase de actividad al constructor de TCPServer

public TCPServer(int portNum, Activity activity, IntroActivity ia) { super(); port = portNum; this.activity = activity; this.ia = ia; }

Luego, después de recibir la respuesta:

void updateButton(final int color, final String txt) { activity.runOnUiThread(new Runnable() { public void run() { ia.getConnectionButton().setBackgroundColor(color); ia.getConnectionButton().setText(txt); } }); }

Como ve, esto no es efectivo en absoluto. Necesito notificar de alguna manera la actividad siempre que se reciba una variable relevante. Utilizo una clase para GlobalVariables y cambio esas variables estáticas después de escuchar (), sin embargo, tengo problemas para notificar la actividad.


En primer lugar, casi siempre es una mala práctica pasar las instancias de actividad. Este es un momento en que es malo.

Defina una interfaz y use una devolución de llamada para que la actividad sepa que se recibió una respuesta.

public interface ResponseReceivedListener { void onResponseReceived(int arg1, string arg2); ..<----add arguments you want to pass back }

En tu clase TCPServer

ArrayList<ResponseReceivedListener> listeners = new ArrayList<ResponseReceivedListener>(); ... public void addResponseReceivedListener(ResponseReceivedListener listener){ if (!listeners.contains(listener){ listeners.add(listener); } } public void removeResponseReceivedListener(ResponseReceivedListener listener){ if (listeners.contains(listener){ listeners.remove(listener); } }

Cuando recibes una respuesta

for (ResponseReceivedListener listener:listeners){ listener.onResponseReceived(arg1, arg2); }

En tu actividad:

public class MainActivity extends Activity implements ResponseReceivedListener { ... @Override public void onCreate(Bundle savedInstanceState) { ... tcpServer.setResponseReceivedistener(this); ... } public void onResponseReceived(int arg1, string arg2){ // do whatever you need to do }

Todo desde la memoria, así que disculpe los errores tipográficos.

Este enfoque desacopla las clases. El servidor TCP no tiene conocimiento de las actividades. Simplemente llama a todos los oyentes registrados. Esos oyentes pueden ser Actividades, pueden ser servicios. Pueden ser instancias de MySparklyUnicorn. El servidor no sabe ni le importa. Simplemente dice "si alguien está interesado, he recibido una respuesta y aquí están los detalles".