Android 我想在活动中发送消息时向多个用户(即组的用户)发送通知
我有用户列表,当我发送消息时,该组中的所有用户都会收到消息,但不会发送通知。我使用for each循环遍历用户列表并发送通知。我使用相同的代码从一个用户向另一个用户发送通知(只需稍加修改)。请问我做错了什么?下面是我的代码:Android 我想在活动中发送消息时向多个用户(即组的用户)发送通知,android,firebase,firebase-realtime-database,firebase-cloud-messaging,Android,Firebase,Firebase Realtime Database,Firebase Cloud Messaging,我有用户列表,当我发送消息时,该组中的所有用户都会收到消息,但不会发送通知。我使用for each循环遍历用户列表并发送通知。我使用相同的代码从一个用户向另一个用户发送通知(只需稍加修改)。请问我做错了什么?下面是我的代码: // sends notification to respective users as soon as message is sent private void sendNotification(final List<String> receivers
// sends notification to respective users as soon as message is sent
private void sendNotification(final List<String> receivers, final String username , final String message){
/* for loop to loop through the list of users id in
the group and send the notification accordingly */
for(final String id : receivers){
DatabaseReference tokens = FirebaseDatabase.getInstance().getReference(Constants.TOKENS_REF);
Query query = tokens.orderByKey().equalTo(id);
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot snapshot : dataSnapshot.getChildren()){
Token token = snapshot.getValue(Token.class);
Data data = new Data(admin_uid, R.mipmap.app_logo_round, username+": "+message,
getString(R.string.application_name), id);
assert token != null;
Sender sender = new Sender(data, token.getToken());
// apiService object to sendNotification to users
apiService.sendNotification(sender)
.enqueue(new Callback<MyResponse>() {
@Override
public void onResponse(Call<MyResponse> call, Response<MyResponse> response) {
if(response.code() == 200){
if(response.body().success != 1){
Toast.makeText(GroupMessageActivity.this,"Failed!",Toast.LENGTH_LONG).show();
}
}
}
@Override
public void onFailure(Call<MyResponse> call, Throwable t) {
// display error message
Toast.makeText(GroupMessageActivity.this,t.getMessage(),Toast.LENGTH_LONG).show();
}
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
// display error message
Toast.makeText(GroupMessageActivity.this,databaseError.getMessage(),Toast.LENGTH_LONG).show();
}
});
}
}
//消息发送后立即向相应的用户发送通知
私有void sendNotification(最终列表接收者、最终字符串用户名、最终字符串消息){
/*for循环浏览中的用户id列表
组并相应地发送通知*/
for(最终字符串id:接收器){
DatabaseReference tokens=FirebaseDatabase.getInstance().getReference(Constants.tokens\u REF);
Query=tokens.orderByKey().equalTo(id);
addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
对于(DataSnapshot快照:DataSnapshot.getChildren()){
Token-Token=snapshot.getValue(Token.class);
数据数据=新数据(admin\u uid,R.mipmap.app\u logo\u round,用户名+“:”+消息,
getString(R.string.application\u name),id);
断言令牌!=null;
发送方=新发送方(数据,token.getToken());
//要向用户发送通知的apiService对象
apiService.sendNotification(发件人)
.enqueue(新的回调函数(){
@凌驾
公共void onResponse(调用、响应){
if(response.code()==200){
if(response.body().success!=1){
Toast.makeText(GroupMessageActivity.this,“Failed!”,Toast.LENGTH_LONG.show();
}
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
//显示错误消息
Toast.makeText(GroupMessageActivity.this,t.getMessage(),Toast.LENGTH_LONG.show();
}
});
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
//显示错误消息
Toast.makeText(GroupMessageActivity.this,databaseError.getMessage(),Toast.LENGTH_LONG.show();
}
});
}
}
我找到了答案,那就是清理我的项目并重建它
为此:
我上面发布的代码运行良好,但我认为android studio行为不端。希望它能在有人遇到类似问题时有所帮助 堆栈溢出是一种效率极低的调试器,因此您必须自己完成大部分工作,然后告诉我们如果仍然卡住会发生什么。例如:当您在调试器中运行代码并在
onDataChange
的第一行上放置断点时,它是否曾经到达那里?如果是这样,您是否可以进入for
循环(即是否有标记
值)?如果是这样的话,onResponse
第一行的断点会被击中吗?好的……让我试试看,然后再回来。@Frank Van Puffelen,断点会击中onDataChange中的第一行,我在下面看到这条消息,我不明白,请:DataSnapshot{key=Tokens,value={upppng2qwabspWS9ku6yiuajxct1={token=d3VQn_ASn-A:APA91bF6Pn9CcYa_zK8cPkt-RGKFTZYMM4M9B7KXBTXWQ8FQZNGDYS1KxOGPWRMVGB9S4IV67DWN92R6ZWRCX56MAYIUIH1XI697TTRQA8CSDSDBLOGAXED2EB40X0AM5YEDRDDIFv}}如果调试器点击第一行,这意味着您正在从数据库获取数据。因此,在这种情况下,问题可能在于如何解析它/处理dataSnapshot
。因此,请继续遵循我第一条评论中的步骤:您是否可以进入for
循环(即是否存在任何标记
值)?如果是这样的话,onResponse
的第一行上的断点是否被击中?将这样做并返回..谢谢