我正在编写一个Android应用,我正在尝试从Firebase数据库中读取数据。我按照文档here了解了如何阅读。现在,当调用OnCancelled时(意味着Firebase读取失败)我检查失败是否是因为internect连接,所以我可以提示用户处理。
所以现在我的代码包含以下内容:
ValueEventListener
和onDataChange
onCancelled
醇>
这是两个代码:
/**
* 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 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());
}
}
});
所以现在我一直试图用适当的动作来填充这个回调。基本上我想要它做的是再次尝试阅读,直到读取成功,或者如果由于同样的原因失败则再次显示相同的互联网对话框(我知道这很难发生,但我已经看到了一些真的闪烁的网络连接,并希望通过处理这种情况安全的方式)。 所以我考虑/尝试过的方法如下:
但是,我在firebase文档中找不到任何具有此效果的API调用。
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
,我不知道用什么替换{{1}这个词}让#{1}}指向监听器!
我可以在这里重新连接并重读?无论是选项1还是2,还是完全不同的。我希望能够在调用Outer
时执行以下操作:检查互联网连接,连接时重试读取,并在连接再次失败时继续执行此操作(您可以将此视为递归)!
答案 0 :(得分:2)
onCancelled被触发:
...如果此侦听器在服务器上失败,或者是 因安全和Firebase数据库规则而被删除。
如果出现网络错误,则不会调用它。当客户端无法访问Firebase服务器时,它将在内部重试连接和任何挂起的读取或写入。您不必编写任何代码来处理这种情况。实际上,您无法改变此行为。