在后台从firebase数据库中读取数据

时间:2017-03-21 04:30:08

标签: android firebase firebase-realtime-database firebase-cloud-messaging

我有一个使用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也被调用,所以我知道这里正在读取数据。但是当我打开应用程序并使用相同的数据库引用转到活动时,活动似乎再次读取数据!为什么会这样?

2 个答案:

答案 0 :(得分:2)

在挖掘了更多内容之后,我发现addListenerForSingleValueEvent正在从缓存中读取而不是从firebase服务器读取,因为我在Application类中设置了FirebaseDatabase.getInstance().setPersistenceEnabled(true);。 我现在已删除了整个ProcessData函数,而是在我的活动中的KeepSynced(true)路径上调用了databasereference

该应用程序正如我预期的那样工作。

感谢所有回复。

答案 1 :(得分:0)

  1. 首先你需要在FCM中使用数据消息,因为当你使用通知消息时,当应用程序在后台时,onMessageReceived永远不会被调用。

  2. 当调用onMessageReceived时,获取新闻ID并启动为您下载新闻内容的意向服务。下载完成后,在该意向服务中创建通知。现在由您自己将新闻内容存储在数据库中,共享pref或通过通知将其传递给待处理的意图。我希望它会对你有所帮助。