我在一个叫做#34; PrincipalActivity.java"
的Activity中有这个代码btnSignIn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final String placa = edtPlaca.getText().toString().trim();
final String token = edtToken.getText().toString().trim();
if (TextUtils.isEmpty(placa)) {
Toast.makeText(getApplicationContext(), "Ingrese una Placa", Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.isEmpty(token)) {
Toast.makeText(getApplicationContext(), "Ingrese el Token de Seguridad", Toast.LENGTH_SHORT).show();
return;
}
mapaIntent = new Intent(getApplicationContext(),MapaActivity.class);
startActivity(mapaIntent);
Toast.makeText(getApplicationContext(), "Principal", Toast.LENGTH_SHORT).show();
myRef.child("lineas").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
try{
Object valor = "";
String clave = "";
mapaIntent = new Intent(getBaseContext(),MapaActivity.class);
for (DataSnapshot lineas: dataSnapshot.getChildren()) {//navegar por lineas
for (DataSnapshot placas: lineas.getChildren()){//navegar por placas
if (placas.getKey().toString().equals(placa.trim())) {
for (DataSnapshot llave : placas.getChildren()) {//navegar por campos de cada placa
valor = llave.getValue();
clave = llave.getKey();
if (clave.equals("token")) {
if (valor.equals(token.trim())) {
Toast.makeText(getApplicationContext(), "Placa y Token correctos!!!", Toast.LENGTH_SHORT).show();
startActivityForResult(mapaIntent,123);
} else {
Toast.makeText(getApplicationContext(), "Token de Seguridad incorrecto", Toast.LENGTH_SHORT).show();
}
}
}
}
}
Toast.makeText(getApplicationContext(),"La placa no existe",Toast.LENGTH_SHORT).show();
}
}catch (Exception ex){
Toast.makeText(getApplicationContext(),"error leyendo",Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
好吧,正如您所看到的,代码是名为btnSigIn的按钮的监听器的一部分。 只要看看try bloc,我就试图开始其他名为MapaActivity的活动。 此意图也在 addValueEventListener (字段更改时为firebase侦听器)内。
在我的MapaActivity课程中,基本上我有这个
class MyLocationListener implements LocationListener {
MyLocationListener(){
ubicacion = new Location("Inicio");
ubicacion.setLatitude(0.0);
ubicacion.setLongitude(0.0);
}
@Override
public void onLocationChanged(Location location) {
if (muestreando){
ubicacion = location;
txtLat.setText("Latitud: "+ location.getLatitude());
txtLon.setText("Longitud: "+ location.getLongitude());
myRef.child("lineas").child("1").child("ABC-123").child("latitud").setValue(location.getLatitude());
myRef.child("lineas").child("1").child("ABC-123").child("longitd").setValue(location.getLongitude());
setResult(1);
}
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
如您所见,是一个侦听器,可以修改Firebase中用户位置的某些参数。
问题
第一堂课完美运作,并将我送到第二项活动(MapaActivity)。
但是,当第二个活动因任何原因(我无法解决)修改firebase数据库时,第一个活动也会监听更改n firebase并再次创建第二个活动及其如何。它发生的次数与位置变化一样多(它刷新火焰基地,第一次活动听取并再次进行seond活动)。
有谁知道为什么?我怎么解决。 谢谢。
答案 0 :(得分:1)
addValueEventListener
不是可以通过点击按钮或其他东西触发的事件。它将始终收听Firebase更改和更新。
addValueEventListener
这是一个回调界面,在Firebase数据库发生任何变化时设置。
一旦你跳到另一个活动停止听EventListener
你有方法removeEventListener,它可以用来删除lsiteners以避免从firebase获得回调。
dbref.removeEventListener(yourListener);
答案 1 :(得分:1)
取消订阅活动中onPause
的活动。
@Override
public void onPause() {
super.onPause();
myRef.removeEventListener(yourValueEventListener);
}
ChildEventListener
相同。
答案 2 :(得分:1)
addListenerForSingleValueEvent
,
也就是说,假设您正在为结果启动一些活动,当回到您的活动时,将再次调用该监听器。
您需要处理您的侦听器onActivityResult
,以确保它不会附加到您的数据库引用。
答案 3 :(得分:0)
您的ValueEventListener会侦听firebase中发生的任何更改。因此,您可以使用ChildEventListener而不是ValueEventListener:
mDatabaseReference.child("User").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
使用ChildEventListener,您可以更具体地了解代码何时应该读取数据库。
答案 4 :(得分:0)
来自Google Firebase参考
一次读取数据
您可以使用addListenerForSingleValueEvent()
方法来简化此方案:它会触发一次,然后不会再次触发。
https://firebase.google.com/docs/database/android/read-and-write#read_data_once