Android: Обратный вызов в действии (фрагменте) запускается с одинаковым значением из Службы, когда время между двумя триггерами очень короткое

#java #android #multithreading #sockets #android-service

Вопрос:

У меня есть служба, которая подключена к сокету в потоке. Когда сокет получает сообщение, он запускает обратный вызов во фрагменте через (статический) интерфейс. Теперь, когда два сообщения получены за очень короткое время (0,3 секунды), обратный вызов запускается дважды, но с одним и тем же возвращаемым значением.

Код: В сервисе я объявил интерфейс следующим образом:

 public interface OnVideoViewTokenReceived {
    void videoViewTokenReceived(String videoStreamToken, String cameraId);
}
public static void setOnVideoViewTokenReceived(OnVideoViewTokenReceived _onVideoViewTokenReceived) {
    Log.d(TAGSHRDL, "_onVideoViewTokenReceived set");
    onVideoViewTokenReceived = _onVideoViewTokenReceived;
}
public static OnVideoViewTokenReceived onVideoViewTokenReceived;
 

и в потоке служба подключается к сокету и получает от него сообщение:

 networkThread = new Thread() {
        @Override
        public void run() {
            ...
            socket.addListener(new WebSocketAdapter() {
                    @Override
                    public void onTextMessage(WebSocket websocket, String message) throws Exception {
                    ....
                    streamToken = messageJSON.getJSONObject("payload").getString("token");
                                Handler handler = new Handler(Looper.getMainLooper()); //!!!Without this, token will not be received in the fragment
                                handler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        onVideoViewTokenReceived.videoViewTokenReceived(streamToken, camId);
                                    }
                                });
                       }
                           }
    };
    networkThread.start();
 

и обратный вызов в моем фрагменте:

 GeneralSocketService.setOnVideoViewTokenReceived(new GeneralSocketService.OnVideoViewTokenReceived() {
        @Override
        public void videoViewTokenReceived(String videoStreamToken, String camId) {
               for (int i = 0; i<9 ; i  ){
     ....}
 

Теперь здесь, в моем фрагменте, все это работает хорошо, но когда время между двумя сообщениями очень короткое, обратный вызов запускается дважды, но с одним и тем же возвращаемым значением videoStreamToken . Я тоже использовал synchronized() , но мне не повезло. Что мне делать?

Комментарии:

1. Можете ли вы попробовать с livedata? слушать, а не перезванивать?

2. Спасибо @RameshKumar. Я бы предпочел посмотреть, в чем, по-моему, проблема с чистой java. в моем коде должен быть какой-то изъян.

3. Это тоже java, но какой-то наблюдатель. Любым способом вы можете добавить задержку, если хотите, или добавить блокировку, подобную синхронизации, при вызове метода