Java 一旦取消,重做Firebase数据库读取
我正在编写一个Android应用程序,目前正在尝试从Firebase数据库读取数据。我遵循了有关如何阅读的文档。现在,在调用OnCancelled的情况下(意味着Firebase读取失败),我检查失败是否是因为Interect连接,以便提示用户处理该问题 现在,我的代码由以下内容组成:Java 一旦取消,重做Firebase数据库读取,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在编写一个Android应用程序,目前正在尝试从Firebase数据库读取数据。我遵循了有关如何阅读的文档。现在,在调用OnCancelled的情况下(意味着Firebase读取失败),我检查失败是否是因为Interect连接,以便提示用户处理该问题 现在,我的代码由以下内容组成: 类中的静态函数,用于检查internet,向用户显示对话框,每两秒钟尝试重新连接一次,如果未连接,则再次显示对话框。它一直这样做,直到互联网连接,然后它调用回调函数在互联网连接后执行操作 firebaseValu
ValueEventListener
同时具有onDataChange
和onCancelled
this
将用于可调用的对象,而不是ValueEventListener
,我不确定用什么替换Outer
,以使this
指向侦听器
我可以在这里做什么来重新连接和阅读?无论是选项1还是选项2,还是其他完全不同的选项。我只希望在调用onCancelled
时能够执行以下操作:检查internet连接,连接时重试读取,如果连接再次失败,则继续执行此操作(您可以将此视为递归) 被触发:
。。。如果此侦听器在服务器上失败,或者
由于安全和Firebase数据库规则而被删除
如果出现网络错误,则不会调用它。当客户端无法访问Firebase服务器时,它将在内部重试连接和任何挂起的读取或写入。您不必编写任何代码来处理这种情况。事实上,您无法更改此行为。但此处列出了网络错误代码:尽可能DatabaseError
?仅仅因为您收到了DatabaseError,并不意味着所有这些情况都有效。DatabaseError是在许多地方使用的通用异常。相反,您应该使用onCancelled
的描述来确定它的功能,我链接了它。谢谢。我还检查了最后一段,它与你所说的一致(虽然它没有明确地说它与reads一起工作)。是的,所有操作都将有效地恢复。侦听器将被重新连接,并将接收结果,就好像什么都没有发生一样。
/**
* 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 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());
}
}
});