Firebase addValueEventListener会继续侦听其他活动

时间:2017-08-21 01:14:56

标签: java android firebase

我在一个叫做#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活动)。

有谁知道为什么?我怎么解决。 谢谢。

5 个答案:

答案 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