取消ValueEventListener()

时间:2017-06-21 12:13:59

标签: android firebase firebase-realtime-database

请帮助我的朋友们,我想使用" addListenerForSingleValueEvent"获取值列表,在此之前我运行progressDialog。所以,当我得到值时,我取消了progressDialog。但有时网络连接速度太慢,没有检索到值,progressDialog会持续显示5到10分钟。所以我想要的是15秒后如果progressDialog仍然显示然后取消progressDialog和ValueEventListener(); i could cancel progressDialog but cant remove ValueEventListener();

我尝试了下面的代码,它停止了progressDialog' but can't remove ValueEventListener();

按下按钮时,调用start_retrieve()方法:

public void start_retrieve(){

    Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            public void run() {
                if(myPd_bar.isShowing()){
                    myPd_bar.dismiss();
                    myRef_final.removeEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {

                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });
                    Toast.makeText(List_papers.this,"Network Connection too Slow!",Toast.LENGTH_LONG).show();
                }
            }
        }, 15000); //after 15 seconds


     myRef = FirebaseDatabase.getInstance().getReference("results");
     myRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {         
          //here code to receive data
            progressDialog.cancel();
        }

        @Override
        public void onCancelled(DatabaseError error) {            
            if(progressDialog.isShowing())
                progressDialog.cancel();        
        }
        });
}

你可以忽略我的程序,我知道它错了,但如果你知道逻辑如何取消ValueEventListener()大约需要10到15秒,请分享。

了解" addListenerForSingleValueEvent"工作,我将手机连接到我的wifi路由器。所以我做的是..我断开我的Lan,所以我的无线路由器工作但没有互联网连接和手机连接到wifi没有任何互联网连接。 现在我按下按钮。在15秒后,progressDialog被解雇。 10分钟后我将我的Lan连接到我的wifi路由器.10分钟后我惊讶地收到了数据......这意味着" addListenerForSingleValueEvent"无限地在背景中工作。请告诉我如何停止" addListenerForSingleValueEvent"

1 个答案:

答案 0 :(得分:0)

我没有看到您对myRef的定义。您可能将myRef定义为函数中的泛型变量,并在handler.postDelayed(new Runnable() {..之后对其进行初始化。 final中的变量必须为Runnable(),但如果您final,则无法更改myRef的值或引用。这可能会导致异常。您可以先创建ref,然后在Runnable中执行您想要的操作。

DatabaseReference myRef = FirebaseDatabase.getInstance().getReference("results");
         myRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {         
              //here code to receive data
                progressDialog.cancel();
            }

            @Override
            public void onCancelled(DatabaseError error) {            
                if(progressDialog.isShowing())
                    progressDialog.cancel();        
            }
            });

Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        public void run() {
            if(progressDialog.isShowing()){
                progressDialog.dismiss();
                myRef.removeEventListener(valueEventListener);
                Toast.makeText(getActivity(),"Network Connection too Slow!",Toast.LENGTH_LONG).show();
            }
    }
}, 15000);

编辑:我现在注意到了。 addListenerForSingleValueEvent返回voidvalueEventListenerhandler.postDelayed(new Runnable() {..的内容是什么?您在哪里创建了它?

编辑2:

中的

myRef_final.removeEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {

                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

您使用ValueEventListener创建new ValueEventListener()的实例,然后使用removeEventListener将其删除。您在removeEventListener中删除的侦听器不是您已创建的侦听器。