【问题标题】:onDataChange() is not being called when offline in android在android中离线时不会调用onDataChange()
【发布时间】:2017-06-25 19:11:11
【问题描述】:

(对不起,我的英语不好)有一个listView 需要由FirebaseDatabase 填充,该setPersistenceEnabled(true) 启用了离线模式。 listView 在在线模式下完美填充,但在离线模式下,listView 不会填充,直到 listView 中有一个之前已在线同步的视图。

我的意思是,如果我在安装后第一次在离线模式下使用应用程序以在离线模式下添加第一个数据(listView 中还没有视图),offline cache 正在写入,但 onDataChange没有被触发,之后如果应用程序上线,listView 会自动填充我之前在离线模式下输入的数据,之后listView 即使在离线模式下也能正常工作。

代码是:

private void getAndSetItem(){

        FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
        DatabaseReference itemReference = firebaseDatabase.getReference().child("groups").child(intent.getStringExtra("groupID"))
                .child("items").child(hiddenUserID);
        itemReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                ArrayList<Item> itemsArray = new ArrayList<Item>();
                for (DataSnapshot snapshot : dataSnapshot.getChildren()){
                    itemsArray.add(snapshot.getValue(Item.class));
                }
                ItemExtractor itemExtractor = new ItemExtractor(itemsArray);
                CustomAdapterForItemList adapter = new CustomAdapterForItemList(ItemPage.this, itemExtractor.getItemNameList(),
                        itemExtractor.getItemPriceList(), itemExtractor.getItemQuantity(), itemExtractor.getDate());
                listView.setAdapter(adapter);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    您无法更改此行为。对于使用 Firebase 数据库离线工作的应用程序,您需要将该应用程序连接到 Firebase 至少一次。您无法像在线一样下载应用、离线并使用数据库。

    这是因为setPersistenceEnabled(true) 首先需要一个 Firebase 连接。因此,将您的应用连接到 Firebase 并使用 setPersistenceEnabled(true) 使您的应用能够离线工作,这意味着 Firebase 将创建它自己的内部(本地)版本的数据库。

    创建该本地副本后,更新数据时,首先将其写入此本地版本的数据库。因此,所有对 Firebase 的写入都会在任何数据写入服务器之前立即触发本地事件。这意味着无论 Internet 连接如何,该应用程序都将保持响应。 重新建立 Internet 连接后,您将收到相应的当前服务器状态。 Firebase 客户端将该数据与 Firebase 服务器以及使用同一数据库的其他客户端同步。

    希望对你有帮助。

    【讨论】:

    • 感谢您告诉我这件事。
    • 不客气,Nishant Bhakta!如果您认为我的回答对您有所帮助,请考虑采纳。谢谢!
    • 你能告诉我,我怎样才能摆脱这个。任何建议。我不能离开这个。
    • 不幸的是你不能。您需要至少联机一次才能创建本地版本的 ypur 数据库。所以流程需要是这样的:下载应用程序->连接到互联网->创建本地数据库副本(它是自动制作的)->离线。
    • 谢谢,我找到了解决方案。我刚刚在 MainActivity 中为该引用调用了带有空白 onDataChange() 的 addListenerForSingleValueEvent,现在它正在工作:)
    【解决方案2】:

    致电itemReference.keepSynced(true)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      相关资源
      最近更新 更多