使用Firebase仅为两个活动检索一次数据

时间:2016-08-12 14:10:27

标签: android firebase firebase-realtime-database data-retrieval

我是Android开发的新手,目前(正在尝试)为学校相关项目编写应用程序。

我有一些存储在Firebase数据库中的数据,我使用onChildEvent()方法检索,我想在两个活动中使用这些数据,一个是GoogleMap,另一个是List。我的问题是,即使我没有检索数据的特殊问题,在我看来,对同一数据做两次不是正确的方法,但我无法帮助找到合适的解决方案。

我考虑过在其中一个活动中检索数据并使用意图将其传递给另一个活动,但由于这两个活动没有直接关联(没有办法也没有理由从一个到另一个),我不知道认为这是一个好主意。

PS:英语不是我的母语,如果有什么不清楚,只要问我,我会尽力重新制定;)

1 个答案:

答案 0 :(得分:0)

就像@Dima Rostopira所说,你可以实现一个Singleton,它在应用程序的过程中存在一次。

示例"位置"对象:

final class LocationModel {

    private Context mContext;

    /** List of locations */
    private ArrayList<Location> mLocations;

    /** Static instance of LocationModel, accessible throughout the scope of the applicaton */
    private static final LocationModel sLocationModel = new LocationModel();

    private LocationModel() {}

    /**
     * Returns static instance of LocationModel
     */
    public static LocationModel getLocationModel() {
        return sLocationModel;
    }

    /**
     * Sets context, allowed once during application
     */
    public void setContext(Context context) {
        if (mContext != null) {
            throw new IllegalStateException("context has already been set");
        }
        mContext = context.getApplicationContext();
    }

    /**
     * Asynchronously loads locations using callback. "forceReload" parameter can be
     * set to true to force querying Firebase, even if data is already loaded.
     */
    public void getLocations(OnLocationsLoadedCallback callback, boolean forceReload) {
        if (mLocations != null && !forceReload) {
            callback.onLocationsLoaded(mLocations);
        }
        // make a call to "callback.onLocationsLoaded()" with Locations when query is completed
    }

    /**
     * Callback allowing callers to listen for load completion
     */
    interface OnLocationsLoadedCallback {
        void onLocationsLoaded(ArrayList<Locations> locations);
    }
}

活动内部的用法:

MainActivity implements OnLocationsLoadedCallback {

...

public void onCreate(Bundle savedInstanceState) {
    ...

    LocationModel.getLocationModel().getLocations(this);

    ...
}


@Override
public void onLocationsLoaded(ArrayList<Locations> location) {
    // Use loaded locations as needed
}