Firebase Database Android - 添加应用范围的 ValueEventListener



我希望我的 Android 应用能够从应用启动时开始侦听 Firebase 数据库引用,直到应用终止。

通过在应用程序的onCreate中的数据库引用处添加 ValueEventListener 并在应用程序的onTerminate中删除它来实现所需的行为:

public class My_Application extends Application {
// The DB ref that the ValueEventListener will be added to.
DatabaseReference dbRef = V_DB.FBREF_CHATROOMS;
// Used to remove ValueEventListeners that were added in this class.
Pair<DatabaseReference, ValueEventListener> mListener;
@Override
public void onCreate() {
    super.onCreate();
    // Add the ValueEventListener.
    ValueEventListener mValueEventListener = dbRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // Do something here.
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
            // Do something here.
        }
    });
    // Store listener.
    mListener = new Pair<>(dbRef, mValueEventListener);
}
@Override
public void onTerminate() {
    super.onTerminate();
    // Remove listener.
    mListener.first.removeEventListener(mListener.second);
}

}

这似乎是显而易见的路,但正如这里所说的Application.onCreate

实现应该尽可能快(例如使用状态的延迟初始化(,因为在此函数中花费的时间直接影响启动进程中第一个活动、服务或接收器的性能。

考虑到上述情况(并且不排除其他潜在问题(,我想问一下,当您想要应用程序范围的ValueEventListener时,我的方法是否是要走的路,或者是否有其他更有效的方法。

按照Ronak Makwana的建议,我使用服务将我所有应用程序范围的ValueEventListeners添加到SplashScreenActivity的onCreate()中。该服务在我的 SplashScreenActivity onDestroy()中停止。在我的服务onDestroy()中,我删除了我添加的所有应用范围的 ValueEventListeners。

@Override
protected void onCreate(Bundle savedInstanceState) {
    // Do other stuff
    // Start service for adding App-Wide Listeners.
    this.startService_AddAppwideValuEventListeners();
}
@Override
protected void onDestroy() {
    super.onDestroy();
    // Stop Service (by doing so, all App-Wide Listenersare removed in Service's onDestroy().
    stopService(new Intent(this, Service_AddAppwideValuEventListeners.class));
}
// Start Service
private void startService_AddAppwideValuEventListeners() {
    // Get Intent for starting my Service that adds some VELs.
    Intent mServiceIntent = new Intent(this, Service_AddAppwideValuEventListeners.class);
    // Start service (this service is stopped in Activity's onDestroy())
    wCurrentContext.startService(mServiceIntent);
}

到目前为止,它就像一个魅力,这样做的开销非常低(因为一切都是在服务中完成的(。

最新更新