将超时设置为Firebase数据库读取查询

时间:2017-05-12 21:05:17

标签: android firebase firebase-realtime-database

当没有互联网连接或任何其他问题时,我正在尝试使用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似乎有同样的问题,但我不明白解决方案。

1 个答案:

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