gpt4 book ai didi

java - 重做 Firebase 数据库读取 onCancelled

转载 作者:行者123 更新时间:2023-12-02 02:05:19 25 4
gpt4 key购买 nike

我正在编写一个 Android 应用,目前正在尝试从 Firebase 数据库中读取数据。我遵循文档 here关于如何阅读。现在,在调用 OnCancelled 的情况下(意味着 Firebase 读取失败),我会检查失败是否是由于互联网连接导致的,以便我可以提示用户处理该问题。

现在我的代码包含以下内容:

  1. 类中的静态函数,用于检查互联网,向用户显示对话框,尝试每两秒重新连接一次,然后在未连接时再次显示对话框。它会一直这样做,直到互联网连接,然后它会回调回调函数以在互联网连接后执行操作。
  2. 带有 onDataChangeonCancelled 的 firebase ValueEventListener

这是两个代码:

连接

/**
* Defined in some separate file in a class called SharedStuff
* This function launches a child thread for checking internet connection.
* It also shows a dialog for the user to reconnect
* Body of the function is irrelevant
*
* @param caller The caller activity. Needed to launch dialogs
* @param callback Actions to do when internet connects
* @param timeout A timeout period after which we will stop trying
*/
public static void isInternetAvailable(final Activity caller, final Callable<Void> callback, final int timeout);

Firebase

/**
* Firebase stuff
* Inside my main activity file
*/
mAuth = FirebaseAuth.getInstance();
mDB = FirebaseDatabase.getInstance();
mDB.getReference("users").child(mAuth.getCurrentUser().getUid()).addValueEventListener(new ValueEventListener()
{
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
{
// Do stuff
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError)
{
if (databaseError.getCode() == DatabaseError.DISCONNECTED || databaseError.getCode() == DatabaseError.NETWORK_ERROR)
{
/**
* Need to try call the internet connection function here with some callback!
*/
SharedStuff.isInternetAvailable(MainActivity.this, new Callable<Void>()
{
@Override
public Void call()
{
// Need to fill this callback!
return null;
}
}, 2000);
}
else
{
Log.wtf(TAG, "Reading database failed", databaseError.toException());
}
}
});

所以现在我一直在尝试用合适的操作来填充这个回调。基本上我希望它做的是尝试再次读取直到读取成功,或者如果由于相同原因失败则再次显示相同的互联网对话框(我知道这种情况很难发生,但我确实看到了一些网络连接闪烁,希望通过处理这种情况来确保安全)。所以我考虑/尝试过的方法如下:

1-强制发生数据更改事件

但是,我在 firebase 文档中找不到任何具有此效果的 API 调用。

2-再次手动添加ValueEventListener

在本例中,我使用 addListenerForSingleValueEvent 而不是 addValueEventListener 但随后我尝试在 onCancelled 内再次连接它!本例的代码如下所示:

/**
* Firebase stuff
*/
mAuth = FirebaseAuth.getInstance();
mDB = FirebaseDatabase.getInstance();
mDB.getReference("users").child(mAuth.getCurrentUser().getUid()).addListenerForSingleValueEvent(new ValueEventListener()
{
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
{
// Do stuff
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError)
{
if (databaseError.getCode() == DatabaseError.DISCONNECTED || databaseError.getCode() == DatabaseError.NETWORK_ERROR)
{
/**
* Need to call the internet connection function here with some callback!
*/
SharedStuff.isInternetAvailable(WelcomeActivity.this, new Callable<Void>()
{
@Override
public Void call()
{
mDB.getReference("users").child(mAuth.getCurrentUser().getUid()).addListenerForSingleValueEvent(Outer.this);
return null;
}
}, 2000);
}
else
{
Log.wtf(TAG, "Reading database failed", databaseError.toException());
}
}
});

这种情况下的问题是关键字 this 适用于 Callable 对象,而不适用于 ValueEventListener,我不确定用什么来替换单词 Outer 以使 this 指向监听器!

我可以在这里做什么来重新连接并重新阅读?无论是选项 1、选项 2 还是完全不同的其他选项。我只是希望能够在调用 onCancelled 时执行以下操作:检查互联网连接,连接时重试读取,如果连接再次失败则继续执行此操作(您可以将其视为递归) !

最佳答案

onCancelled被触发:

... in the event that this listener either failed at the server, or is removed as a result of the security and Firebase Database rules.

如果出现网络错误,则不会调用它。当客户端无法访问 Firebase 服务器时,它将在内部重试连接以及任何挂起的读取或写入操作。您不必编写任何代码来处理这种情况。事实上,您无法改变这种行为。

关于java - 重做 Firebase 数据库读取 onCancelled,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50919030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com