当没有互联网连接或任何其他问题时,我正在尝试使用Firebase数据库进行读取查询超时。问题是即使超时生效并且删除了侦听器,即使它已被删除,它仍然会被调用。我怎么能防止这种情况?什么是处理超时的最佳方法?
这是我的代码:
final DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("key");
final ValueEventListener listener = new ValueEventListener() { /* ... */ };
ref.addListenerForSingleValueEvent(listener);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
ref.removeEventListener(listener);
}
}, 5000);
Someone here似乎有同样的问题,但我不明白解决方案。
答案 0 :(得分:2)
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 async 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
}
}