【发布时间】:2017-03-21 04:30:07
【问题描述】:
我有一个应用程序使用firebaserecycleradapter/view 在屏幕上显示数据。效果很好,但我有一个问题。当我发送突发新闻通知时,当用户单击通知时,我的新闻应用程序会打开,但需要一段时间才能加载最新新闻。
我想在通知的onMessageReceived 的后台加载数据(其中也包含数据),这样当用户打开新闻活动时,最新的新闻项目已经可用。代码如下:
public void onMessageReceived(RemoteMessage remoteMessage) {
// Check if message contains a data payload.
if (remoteMessage.getData().size() > 0) {
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
processData(remoteMessage);
}
// Check if message contains a notification payload.
if (remoteMessage.getNotification() != null) {
Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
}
}
private void processData(RemoteMessage rm){
// This is the exact same ref and query that is used by the firebaserecycleradapter
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("all_news");
Query q = ref.orderByChild("mStatus").equalTo(2).limitToLast(100);
q.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Nothing. The idea is just to read the data upfront so that fetch appears faster
Long count = dataSnapshot.getChildrenCount();
Log.d(TAG, "ProcessData Count" + count);
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Nothing
}
});
}
ProcessData 被调用,onDataChanged 也被调用,所以我知道这里正在读取数据。但是当我打开应用程序并使用相同的数据库引用转到活动时,活动似乎再次读取数据!为什么会这样?
【问题讨论】:
-
为此使用 Intent Services,即使应用程序未处于前台状态,它也可以在后台调用 processData(remoteMessage)。
-
尝试在
processData之前使用CountDownLatch或Semaphore阻塞线程 -
如果我的问题不清楚,我很抱歉。我在两个不同的地方(一个在 Firebase 消息服务内部,另一个在活动内部)使用相同的 firebase 数据库引用。如果我在一个地方(例如,在消息传递服务内部)从数据库引用中读取所有数据,那么该数据是否应该自动反映在另一个地方(在我打开它时的活动中)?
标签: android firebase firebase-realtime-database firebase-cloud-messaging