#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, но какой-то наблюдатель. Любым способом вы можете добавить задержку, если хотите, или добавить блокировку, подобную синхронизации, при вызове метода