2016-08-12 63 views
0

我是Android開發新手,目前正在嘗試爲學校相關項目編寫應用程序。使用Firebase爲兩項活動檢索數據只有一次

我有一些數據存儲在使用onChildEvent()方法檢索的Firebase數據庫中,我想在兩個活動中使用此數據,一個是GoogleMap,另一個是List。我的問題是,即使我沒有特別的問題檢索數據,但在我看來,對相同的數據做兩次並不是正確的做法,但我無法找到合適的解決方案。

我想過檢索其中一個活動中的數據並使用intent將它傳遞給另一個,但由於這兩個活動沒有直接關聯(沒有辦法也沒有理由從一個到另一個),所以我不要認爲這是一個好主意。

PS:英語不是我的母語,如果有什麼不明確,只是問我會盡我所能,重新制定;)

+2

您可以簡單地使用Singleton模式, –

回答

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 
} 
+0

非常感謝,這似乎是正是我一直在尋找爲! (我已經可以告訴你這個例子爲我節省了很多時間:D) – Nap

+0

皮尤,我遇到了一個實現getLocations方法的問題......我的問題是,我怎麼能知道我的查詢已完成?因爲在addChildEventListener()之後添加callback.onLocationLoaded(mLocations)實際上不起作用......(對於愚蠢的問題抱歉,但我無法在任何地方找到答案......) – Nap

+0

此外,此解決方案是否可以正常工作與實時數據?由於存儲在我的Firebase數據庫中的數據是動態的(用戶可以編輯它),並且我希望在使用它時可以訪問最後一個信息 – Nap