android - 在后台从firebase数据库读取数据

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

我有一个使用 firebaserecycleradapter/view 在屏幕上显示数据的应用程序。工作得很好,但我有一个问题。当我发送突发新闻通知并且用户单击通知时,我的新闻应用程序将打开,但需要一段时间才能加载最新新闻。

我想在通知的onMessageReceived中加载后台数据(也包含数据),以便当用户打开新闻 Activity 时,最新的新闻项已经可用。代码如下:

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 也被调用,所以我知道数据正在此处读取。但是当我打开应用程序并使用相同的数据库引用转到 Activity 时,该 Activity 似乎再次读取数据!为什么会发生这种情况?

最佳答案

经过更多研究后,我发现 addListenerForSingleValueEvent 是从缓存中读取的,而不是从 Firebase 服务器读取的,因为我设置了 FirebaseDatabase.getInstance().setPersistenceEnabled(true) ; 在我的应用程序类中。 我现在已删除整个 ProcessData 函数,而是在 Activity 中的 databasereference 路径上调用 KeepSynced(true)

该应用程序现在按我的预期运行。

感谢大家的回复。

关于android - 在后台从firebase数据库读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42918476/

相关文章:

android - CameraManager 仅提供 2 个摄像头 ID,但一个设备具有三个物理摄像头。为什么?

node.js - 使用 Amazon SES 服务从 node.js 发送电子邮件不起作用

javascript - 如何检查firebase中的电子邮件是否在React Native中经过验证?

javascript - Firebase 实时数据库 - o​​rderByChild 不返回任何结果

java - 从 firebase 数据库获取数据时期望开始数组时出错

java - 使用 Parcelable 对象将数据发送到 Fragment 而不是 Activity

android - 由于超时,应用程序无法在模拟器上启动

android - 我可以覆盖可绘制形状的某些属性吗?

android - 使用方法返回值调用 firebase Firestore 时无法获取变量中的数据

android - 如何使用 POJO 类获取 Long 中的 Firebase ServerValue.Timestamp