从firebase数据库读取值时超时?

时间:2017-09-24 11:02:40

标签: android firebase firebase-realtime-database

使用addListenerForSingleValueEvent从firebase获取数据时如何添加连接/读取超时? 当我使用addListenerForSingleValueEvent打电话来获取数据时,我ProgressBar可见,并在ProgressBar中提取数据时或在发生某些错误时再次使onDataChange不可见onCancelled。但是,当没有互联网连接时,ProgressBar仍然可见,因为onDataChangeonCancelled永远不会被调用。如何让ProgressBar再次隐身?我认为超时是一个很好的解决方案,但我没有在firebase API中找到任何类似超时的东西,如果除了超时之外还有另一种方法来解决这个问题那么请告诉我。感谢。

1 个答案:

答案 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
    }
}