Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一旦取消,重做Firebase数据库读取_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java 一旦取消,重做Firebase数据库读取

Java 一旦取消,重做Firebase数据库读取,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在编写一个Android应用程序,目前正在尝试从Firebase数据库读取数据。我遵循了有关如何阅读的文档。现在,在调用OnCancelled的情况下(意味着Firebase读取失败),我检查失败是否是因为Interect连接,以便提示用户处理该问题 现在,我的代码由以下内容组成: 类中的静态函数,用于检查internet,向用户显示对话框,每两秒钟尝试重新连接一次,如果未连接,则再次显示对话框。它一直这样做,直到互联网连接,然后它调用回调函数在互联网连接后执行操作 firebaseValu

我正在编写一个Android应用程序,目前正在尝试从Firebase数据库读取数据。我遵循了有关如何阅读的文档。现在,在调用OnCancelled的情况下(意味着Firebase读取失败),我检查失败是否是因为Interect连接,以便提示用户处理该问题

现在,我的代码由以下内容组成:

  • 类中的静态函数,用于检查internet,向用户显示对话框,每两秒钟尝试重新连接一次,如果未连接,则再次显示对话框。它一直这样做,直到互联网连接,然后它调用回调函数在互联网连接后执行操作
  • firebase
    ValueEventListener
    同时具有
    onDataChange
    onCancelled
  • 以下是两个代码:

    联系 本例中的问题是,关键字
    this
    将用于
    可调用的
    对象,而不是
    ValueEventListener
    ,我不确定用什么替换
    Outer
    ,以使
    this
    指向侦听器

    我可以在这里做什么来重新连接和阅读?无论是选项1还是选项2,还是其他完全不同的选项。我只希望在调用
    onCancelled
    时能够执行以下操作:检查internet连接,连接时重试读取,如果连接再次失败,则继续执行此操作(您可以将此视为递归)

    被触发:

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


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

    但此处列出了网络错误代码:尽可能
    DatabaseError
    ?仅仅因为您收到了DatabaseError,并不意味着所有这些情况都有效。DatabaseError是在许多地方使用的通用异常。相反,您应该使用
    onCancelled
    的描述来确定它的功能,我链接了它。谢谢。我还检查了最后一段,它与你所说的一致(虽然它没有明确地说它与reads一起工作)。是的,所有操作都将有效地恢复。侦听器将被重新连接,并将接收结果,就好像什么都没有发生一样。
    /**
    * 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());
            }
        }
    });
    
    /**
    * 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());
            }
        }
    });