【问题标题】:Reading data from firebase database in the background在后台从 Firebase 数据库中读取数据
【发布时间】: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之前使用CountDownLatchSemaphore阻塞线程
  • 如果我的问题不清楚,我很抱歉。我在两个不同的地方(一个在 Firebase 消息服务内部,另一个在活动内部)使用相同的 firebase 数据库引用。如果我在一个地方(例如,在消息传递服务内部)从数据库引用中读取所有数据,那么该数据是否应该自动反映在另一个地方(在我打开它时的活动中)?

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


【解决方案1】:

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

该应用程序现在可以正常运行。

感谢所有回复。

【讨论】:

    【解决方案2】:
    1. 首先您需要在 FCM 中使用数据消息,因为当您使用通知消息时,当应用处于后台时,onMessageReceived 永远不会被调用。

    2. 当 onMessageReceived 被调用时,然后获取新闻 id 并启动为您下载新闻内容的意图服务。下载完成后,在该意图服务中创建通知。现在由您将新闻内容存储在数据库中,共享首选项或通过通知将其传递到待处理的意图中。我希望它会帮助你。

    【讨论】:

    • 我知道您可以选择编写下载新闻内容的代码,然后在此处显示通知,或者创建一个单独的 Intent 服务来处理这种新的场景。
    猜你喜欢
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多