使用addListenerForSingleValueEvent
从firebase获取数据时如何添加连接/读取超时?
当我使用addListenerForSingleValueEvent
打电话来获取数据时,我ProgressBar
可见,并在ProgressBar
中提取数据时或在发生某些错误时再次使onDataChange
不可见onCancelled
。但是,当没有互联网连接时,ProgressBar
仍然可见,因为onDataChange
或onCancelled
永远不会被调用。如何让ProgressBar
再次隐身?我认为超时是一个很好的解决方案,但我没有在firebase API中找到任何类似超时的东西,如果除了超时之外还有另一种方法来解决这个问题那么请告诉我。感谢。
答案 0 :(得分:2)
由于@Doug史蒂文森说,Firebase API中没有像超时那样的东西,因此应该使用我们自己的逻辑来处理超时。这就是我在代码中实现超时的方法。
private void getDataFromFirebase()
{
final boolean[] gotResult = new boolean[1];
gotResult[0] = false;
FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
DatabaseReference dataReference = firebaseDatabase.getReference().child("data");
ValueEventListener dataFetchEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
gotResult[0] = true;
// You code goes here
}
@Override
public void onCancelled(DatabaseError databaseError) {
gotResult[0] = true;
}
};
if(isNetworkAvailable()) {
dataReference.addListenerForSingleValueEvent(dataFetchEventListener);
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
timer.cancel();
if (gotResult[0] == false) { // Timeout
dataReference.removeEventListener(dataFetchEventListener);
// Your timeout code goes here
}
}
};
// Setting timeout of 10 sec to the request
timer.schedule(timerTask, 10000L);
}
else{
// Internet not available
}
}