【问题标题】:Set a timeout to a Firebase Database read query为 Firebase 数据库读取查询设置超时
【发布时间】:2017-05-12 21:05:17
【问题描述】:

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

【问题讨论】:

  • 您找到解决方案了吗?
  • @ParagKadam 不,我没怎么看
  • 我已经解决了,看看我的答案。

标签: android firebase firebase-realtime-database


【解决方案1】:

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

【讨论】:

  • 你可以使用 AtomicBoolean: AtomicBoolean gotResult = new AtomicBoolean(false) 来设置 use gotResult.set(true) 并检索 use gotResult.get() ,它返回一个原始 boolean
猜你喜欢
  • 2020-09-08
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多