2017-06-24 29 views
2

我是新來的android MVP模式,並在我的項目上工作我有一些與演示者中的Android上下文相關的基本問題。雖然有很多相關的答案,但我沒有得到一個完美的解決我的問題。MVP主持人內部的上下文相關問題

我有以下疑問:

  1. 如何訪問內部演示共享偏好。
  2. 如何訪問演示者內部的其他系統服務。
  3. 如果我正在使用SQLite數據庫,那麼在我的數據庫中的任何事務期間,通過從演示者調用我的SQLite Helper類需要上下文來訪問數據庫。

如果我將在演示者中傳遞我的活動上下文,那麼它將在單元測試期間出現問題,而且它是根據MVP格式的違規。 我需要一個完美的解決方案,以便我的代碼質量不降低。

注意:我不想使用匕首工具,所以答案應該是匕首獨立

回答

2

在MVP你不使用Context或任何從Android SDK /框架否則在Presenter(P)層!該層用於與Android相關的任何內容。

1)如何訪問演示者內部的共享喜好。

你不知道。如果您需要SharedPrefencesPresenter的值,則可以通過方法調用將值傳遞給Presenter

實施例:

class MainActivity{ 
String birthday = SharedPrefence.getString(..); 
presenter.setSavedBirtday(birthday); 

} 

2)如何訪問內部呈現其它系統服務。

如前所述;您不訪問Presenter中的系統服務。 您可以從演示者調用系統服務。

實施例採用振動器:

1 - 創建的接口:

interface OnSystemServiceCaller{ 
    onVibratorCall(); 
} 

2 - 在一個活動

class MainActivity implements OnSystemServiceCaller{ 

@Override 
onVibratorCall(){ 
    Vibrator v = (Vibrator) getSystemService(VIBRATOR); 
    v.vibrate(50); 

    } 
} 

3實現它 - 從演示呼叫

class Presenter{ 
OnSystemServiceCaller listener; 

    public void ifButtonClicked(){ 
    listener.onVibrateCall(); 
    } 

} 

3)如果我正在使用SQLite數據庫,那麼在我的數據庫中的任何事務期間,通過從演示者調用我的SQLite Helper類需要上下文來訪問數據庫。

有些不喜歡這個回答其他意願,這只是一個建議。

您可以SQLite如果您的應用類使用全局ApplicationContext()(類擴展應用程序訪問,因爲你的SQLlite see how here是全球性的整個應用程序,而不是某一特定活動而當你需要從SQLite的數據傳遞到一個Activity那麼你首先將它傳遞給PresenterPresenterActivity以同樣的方式,我們將來電轉到我們的振動器方法

+0

@saksham全球範圍內,請參閱:https://stackoverflow.com/a/9445685/ 5366495. 從更新數據庫的路徑讓我們可以說你從'Edittext'得到的值可以是這樣的:'Edittext.gettext() - >將文本傳遞給演示者 - >從演示者 - >到您的數據庫層。我也會建議看一下'RealmDatabases',它可以幫助你解決大部分問題,並且讓所有東西都變得更加貼心! – Muddz

+0

我知道如何在領域數據庫上工作。我已經完成了領域的項目,因爲領域不需要上下文,所以它很容易與MVP實現,但我的項目之一是完全基於sql精簡版,所以我需要的解決方案 – saksham

+0

是安全的將ApplicationContext()存儲在靜態字段? – saksham