Md *_*min 3 java android websocket node.js socket.io
我正在 NodeJS 和 Android 中使用 socket.IO 构建一个测验应用程序,
quizzoStatus当我从服务器发出事件时,我遇到一个问题,该事件第一次触发一次,第二次触发两次,依此类推。
这里我附上我的代码片段
///server side: NodeJS
socket.on('sendQuizzoAnsPoints', async (data)=>{
try {
const obj = JSON.parse(data);
const game = await QuizzoPlayModel.findOne({_id:obj.gameId});
const player = await UserModel.findOne({_id: game.playerId});
const opponent = await UserModel.findOne({_id: game.opponentId});
if(obj.userId == game.opponentId){
let update = {
opponentPoints: game.opponentPoints + obj.points || 0,
opponentWA: game.opponentWA + obj.wrongAns || 0,
};
await QuizzoPlayModel.findByIdAndUpdate(obj.gameId, update).lean().exec();
userNamespace.to(player.socketId).emit('quizzoStatus', {
fullName: opponent.fullName,
points: game.playerPoints + obj.points,
wrongAns: obj.wrongAns,
gameId: obj.gameId
});
}
if(obj.userId == game.playerId) {
let update = {
playerPoints: game.playerPoints + obj.points || 0,
playerWA: game.playerWA + obj.wrongAns || 0,
};
await QuizzoPlayModel.findByIdAndUpdate(obj.gameId, update).lean().exec();
userNamespace.to(opponent.socketId).emit('quizzoStatus', {
fullName: player.fullName,
points: game.playerPoints+ obj.points,
wrongAns: obj.wrongAns,
gameId: obj.gameId
});
}
} catch (e) {
console.log(e);
}
});
Run Code Online (Sandbox Code Playgroud)
在这里,我监听一个名为 的事件sendQuizzoAnsPoints,然后在另一个名为 的事件中向玩家或对手发出一个事件quizzoStatus。
该
quizzoStatus事件从服务器到 Android 多次触发。这里我附上了android代码
/// Android code
socket.emit("sendQuizzoAnsPoints", new Gson().toJson(quizzoStatusRequestDto));
socket.on("quizzoStatus", new Emitter.Listener(){
@Override
public void call(Object... args){
runOnUiThread(new Runnable(){
@Override
public void run(){
Log.e("opponet point", opponentPoints + " " + quizzoStatusResponseDto.getPoints());
}
});
}
});
Run Code Online (Sandbox Code Playgroud)
问题出在Android. 您每次都会分配新的侦听器,而不删除前一个侦听器。您需要创建该侦听器的变量,并在工作完成后将Emmiter其删除或其他地方:onDestroy
//variable of Emmiter.Listener
Emmiter.Listener quizzoStatus = new Emitter.Listener(){
@Override public void call(Object... args){
runOnUiThread(new Runnable(){
@Override public void run(){
Log.e("opponet point", opponentPoints + " " + quizzoStatusResponseDto.getPoints());
}
});
}
};
//assigning the listener
socket.on("quizzoStatus", quizzoStatus);
. . . .
@Override protected void onDestroy(){
super.onDestroy();
//removing the listener...
socket.off("quizzoStatus", quizzoStatus);
}
Run Code Online (Sandbox Code Playgroud)
希望这会起作用
| 归档时间: |
|
| 查看次数: |
637 次 |
| 最近记录: |