Redo Firebase数据库读取onCancelled

时间:2018-06-19 00:16:49

标签: java android firebase firebase-realtime-database

我正在编写一个Android应用,我正在尝试从Firebase数据库中读取数据。我按照文档here了解了如何阅读。现在,当调用OnCancelled时(意味着Firebase读取失败)我检查失败是否是因为internect连接,所以我可以提示用户处理。

所以现在我的代码包含以下内容:

  1. 类中的静态函数,用于检查Internet,向用户显示对话框,尝试每两秒重新连接一次,如果未连接则再次显示对话框。它一直这样做,直到互联网连接,然后它回拨一个回调函数,以便在互联网连接后执行操作。
  2. 包含ValueEventListeneronDataChange
  3. 的firebase onCancelled

    这是两个代码:

    连接

    /**
    * Defined in some separate file in a class called SharedStuff
    * This function launches a child thread for checking internet connection. 
    * It also shows a dialog for the user to reconnect
    * Body of the function is irrelevant
    *
    * @param caller The caller activity. Needed to launch dialogs
    * @param callback Actions to do when internet connects
    * @param timeout A timeout period after which we will stop trying
    */
    public static void isInternetAvailable(final Activity caller, final Callable<Void> callback, final int timeout);
    

    火力地堡

    /**
    * Firebase stuff
    * Inside my main activity file
    */
    mAuth = FirebaseAuth.getInstance();
    mDB = FirebaseDatabase.getInstance();
    mDB.getReference("users").child(mAuth.getCurrentUser().getUid()).addValueEventListener(new ValueEventListener()
    {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot)
        {
            // Do stuff
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError)
        {
            if (databaseError.getCode() == DatabaseError.DISCONNECTED || databaseError.getCode() == DatabaseError.NETWORK_ERROR)
            {
                /**
                * Need to try call the internet connection function here with some callback!
                */
                SharedStuff.isInternetAvailable(MainActivity.this, new Callable<Void>()
                {
                    @Override
                    public Void call()
                    {
                        // Need to fill this callback!
                        return null;
                    }
                }, 2000);
            }
            else
            {
                Log.wtf(TAG, "Reading database failed", databaseError.toException());
            }
        }
    });
    

    所以现在我一直试图用适当的动作来填充这个回调。基本上我想要它做的是再次尝试阅读,直到读取成功,或者如果由于同样的原因失败则再次显示相同的互联网对话框(我知道这很难发生,但我已经看到了一些真的闪烁的网络连接,并希望通过处理这种情况安全的方式)。 所以我考虑/尝试过的方法如下:

    1-强制数据更改事件发生

    但是,我在firebase文档中找不到任何具有此效果的API调用。

    2-再次手动添加ValueEventListener

    在这种情况下,我使用addListenerForSingleValueEvent代替addValueEventListener但是我尝试在onCancelled中再次连接它! 这种情况的代码如下所示:

    /**
    * Firebase stuff
    */
    mAuth = FirebaseAuth.getInstance();
    mDB = FirebaseDatabase.getInstance();
    mDB.getReference("users").child(mAuth.getCurrentUser().getUid()).addListenerForSingleValueEvent(new ValueEventListener()
    {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot)
        {
            // Do stuff
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError)
        {
            if (databaseError.getCode() == DatabaseError.DISCONNECTED || databaseError.getCode() == DatabaseError.NETWORK_ERROR)
            {
                /**
                * Need to call the internet connection function here with some callback!
                */
                SharedStuff.isInternetAvailable(WelcomeActivity.this, new Callable<Void>()
                {
                    @Override
                    public Void call()
                    {
                        mDB.getReference("users").child(mAuth.getCurrentUser().getUid()).addListenerForSingleValueEvent(Outer.this);
                        return null;
                    }
                }, 2000);
            }
            else
            {
                Log.wtf(TAG, "Reading database failed", databaseError.toException());
            }
        }
    });
    

    在这种情况下的问题是关键字this将用于Callable对象而不是ValueEventListener,我不知道用什么替换{{1}这个词}让#{1}}指向监听器!

    我可以在这里重新连接并重读?无论是选项1还是2,还是完全不同的。我希望能够在调用Outer时执行以下操作:检查互联网连接,连接时重试读取,并在连接再次失败时继续执行此操作(您可以将此视为递归)!

1 个答案:

答案 0 :(得分:2)

onCancelled被触发:

  

...如果此侦听器在服务器上失败,或者是   因安全和Firebase数据库规则而被删除。

如果出现网络错误,则不会调用它。当客户端无法访问Firebase服务器时,它将在内部重试连接任何挂起的读取或写入。您不必编写任何代码来处理这种情况。实际上,您无法改变此行为。