Как уведомлять активность при изменении глобальных переменных

У меня есть приложение для Android, которое подключается к компьютеру через USB-кабель. Я использую класс TCPServer для отправки сообщений и прослушивания. Например:

Когда я отправляю сообщение вроде: запрос: x
Я получаю ответ: ответ: x: 55

Мне нужно внести изменения в свою деятельность в соответствии с полученным ответом. В настоящий момент я временно решил проблему, передав объект активности и класса активности конструктору TCPServer

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

Затем после получения ответа:

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

Как вы видите, это совсем неэффективно. Мне нужно как-то уведомлять о деятельности всякий раз, когда получена соответствующая переменная. Я использую класс для GlobalVariables и изменяю эти статические переменные после прослушивания(), однако у меня возникают проблемы с уведомлением об активности.

Ответ 1

Прежде всего, почти всегда плохая практика пропускает экземпляры Activity. Это время, когда это плохо.

Определите интерфейс и используйте обратный вызов, чтобы сообщить активности, что ответ получен.

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

В вашем классе 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);
    }
}

Когда вы получите ответ

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

В вашей деятельности:

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
}

Все из памяти, поэтому, пожалуйста, извините опечатки.

Этот подход отделяет классы. Сервер TCP не знает о действиях. Он просто обращается к любому зарегистрированному слушателю. Этими слушателями могут быть занятия, они могут быть услугами. Они могут быть примерами MySparklyUnicorn. Сервер не знает и не заботится. Он просто говорит: "Если кто-то заинтересован, я получил ответ, и вот подробности".