请帮助我的朋友们,我想使用" 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"
答案 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
返回void
。 valueEventListener
中handler.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
中删除的侦听器不是您已创建的侦听器。