ValueEventListener перестает работать через некоторое время базы данных firebase - PullRequest
0 голосов
/ 30 ноября 2018

Я использую ValueEventListener для обнаружения изменений данных в firebase.Я испытываю странную ситуацию, когда мое приложение может добавлять и получать данные в приложении, когда данные успешно изменились, но мое приложение не может читать данные из базы данных Firebase, если оно установлено на других устройствах, даже если произошло изменение данных.

Мое приложение отлично работает на обоих устройствах в течение первого дня установки, после чего ValueEventListener перестает отвечать на приложения других устройств.

вот код для установки данныхв базу данных firebase:

public class FirebaseSync extends Service {
FirebaseDatabase fd;
DatabaseReference drr;

@Override
public void onCreate() {
    super.onCreate();

    fd = FirebaseDatabase.getInstance();
    LocalBroadcastManager.getInstance(FirebaseSync.this).registerReceiver(fReceive, new IntentFilter("FIRE"));
    LocalBroadcastManager.getInstance(FirebaseSync.this).registerReceiver(fCity, new IntentFilter("FCITY"));
    drr = fd.getReference("users").child("key").child("city");
    drr.setValue("--");
}



private BroadcastReceiver fReceive = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent != null){

            FireData fireData = new FireData(distance, speed, time, status);
            DatabaseReference dr = fd.getReference("users").child("key");
            dr.setValue(fireData, new DatabaseReference.CompletionListener() {
                @Override
                public void onComplete(@Nullable DatabaseError databaseError, @NonNull DatabaseReference databaseReference) {

                    Log.i("FIREME","Value was set. Error = "+databaseError);                      
                }
            });
        }
    }
};

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    LocalBroadcastManager.getInstance(FirebaseSync.this).unregisterReceiver(fReceive);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}
}

Код для получения данных из базы данных:

public class Fire extends AppCompatActivity {

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef, cref;
boolean connected;
ValueEventListener listener;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fire);

    connected = false;

    cref = FirebaseDatabase.getInstance().getReference(".info/connected");
    cref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            if (dataSnapshot.getValue(Boolean.class) != null){
                connected = dataSnapshot.getValue(Boolean.class);

                if (connected){
                    firest.setText("Connected");
                }else {
                    firest.setText("Disconnected");
                }
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            firest.setText("Listener was cancelled");
        }
    });
}

@Override
protected void onStart() {
    super.onStart();

    myRef = database.getReference("users").child("key");

    myRef.keepSynced(true);

    listener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            try {
                double di = dataSnapshot.child("dis").getValue(Double.class);
                double sp = dataSnapshot.child("spe").getValue(Double.class);
                String ti = dataSnapshot.child("ti").getValue(String.class);
                boolean st = dataSnapshot.child("sta").getValue(Boolean.class);
                String ci = dataSnapshot.child("cit").getValue(String.class);
                                                    distance.setText(String.format(getResources().getString(R.string.distT), dista, units));
                speed.setText(String.format(getResources().getString(R.string.speedT), speeda));
                time.setText(timea);
                cityText.setText(cityN);


            }catch (NullPointerException e){
                e.printStackTrace();
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

            Toast.makeText(Fire.this, "something wrong happened at read value", Toast.LENGTH_LONG).show();
        }
    };

    myRef.addValueEventListener(listener);        
}

@Override
protected void onStop() {
    super.onStop();

    if (myRef != null && listener != null){
        myRef.removeEventListener(listener);

    }

}
}

Я также добавил ключ отладки и выпуска SHA1на консоли Firebase, но это также не работает.

Разрешение базы данных:

  {
  "rules": {
    ".read": true,
    ".write": true
  }
}

App Gradle

    apply plugin: 'com.android.application'
    apply plugin: 'com.google.gms.google-services'

    android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.example.adarsh.epoch"
        minSdkVersion 19
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
         testInstrumentationRunner        "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
         }
         buildTypes {
         release {
            minifyEnabled false
            proguardFiles   getDefaultProguardFile('proguardandroid.txt'),'proguard-rules.pro'
        }
    }
}

        dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        //noinspection GradleCompatible
        implementation 'com.android.support:appcompat-v7:27.1.1'
         implementation 'com.android.support.constraint:constraint-  layout:1.1.3'
          testImplementation 'junit:junit:4.12'
          androidTestImplementation 'com.android.support.test:runner:1.0.2'
           androidTestImplementation   'com.android.support.test.espresso:espresso-core:3.0.2'


            implementation 'com.squareup.okhttp3:okhttp:3.11.0'
            implementation 'com.google.android.gms:play-services-location:16.0.0'
            implementation 'com.google.android.gms:play-services-maps:16.0.0'
            implementation 'com.google.android.gms:play-services-places:16.0.0'
            implementation 'com.google.maps.android:android-maps-utils:0.5'
            implementation 'com.google.code.gson:gson:2.8.5'
             implementation 'com.google.firebase:firebase-core:16.0.5'
            implementation 'com.google.firebase:firebase-database:16.0.4'


}

Прошла неделя, и у меня не было никакого решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...