【发布时间】:2019-07-03 13:34:53
【问题描述】:
我有用户列表,当我发送消息时,该组中的所有用户都会收到消息,但不会发送通知。我使用 for each 循环遍历用户列表并发送通知。我正在使用相同的代码从一个用户向另一个用户发送通知(只是稍作修改)。请问我做错了什么?下面是我的代码:
// 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();
}
});
}
}
【问题讨论】:
-
Stack Overflow 是一个非常低效的调试器,所以你必须自己做很多事情,然后告诉我们如果你仍然卡住会发生什么。例如:当您在调试器中运行代码并在
onDataChange的第一行放置断点时,它会到达那里吗?如果是这样,您可以进入for循环(即是否有任何token值)?如果是这样,onResponse第一行的断点会被命中吗? -
好的....让我试试,然后请回来。
-
@Frank Van Puffelen,断点到达 onDataChange 的第一行,我在下面收到这条消息,但我不明白:DataSnapshot { key = Tokens, value = {upbpNg2QWabSpWS9kU6YIuAJxct1={token=d3VQn_ASn-A :APA91bF6Pn9CcYa_zK8cPkt-RgKftzymm4m9b7Kxbtxwq8FQZnGDyS1KOxoGpwrmvGb9s4iv67dWn92R6ZwRcX56MAYiUIh1XI697ttRQA8csDSZBLOLgAXEd22eB40x0Am5YedrdifV}}}
-
如果调试器命中第一行,这意味着您正在从数据库中获取数据。因此,在这种情况下,问题可能在于您如何解析/处理
dataSnapshot。所以请继续按照我的第一条评论中的步骤操作:您可以进入for循环(即是否有任何token值)?如果是这样,onResponse第一行的断点会被命中吗? -
会这样做并回来..谢谢
标签: android firebase firebase-realtime-database firebase-cloud-messaging