2017-08-05 22 views
0

我想構建實用程序類。它應該從數據庫中讀取值,提供典型的UI或交互功能,例如設置應用程序的標題,設置背景圖片,播放背景音樂。構建UI實用程序類的最佳方法

因爲提出了其他問題How to use UI functions in non UI methods?我意識到我有一堆不同的方式來做到這一點。我測試了每種方法設置標籤的方法,每種方式都有效。但是哪個是最乾淨/正確/自信的方式,爲什麼?

在這些例子中,調用類是一個kotlin類,但這是無所謂的。

方式一!相關的所有活動都在呼叫活動中完成。上下文是通過構造函數傳遞的,也可以在每個函數調用時調用。 在我看來,我們在這裏確實沒有太多的依賴關係,但實用程序用戶必須自己做很多事情。

調用類:

frameworkFeatures(applicationContext); 
setTitle(frameworkFeatures.frameworkSetTitlesStaticContext()); 

稱爲類:

private static Context frameworkContext; 

    public frameworkFeatures(Context context) { 

     frameworkContext = context; 

    } 

    public static String frameworkSetTitlesStaticContext(){ 

     TestMainDatabase.getDatabase(frameworkContext); 
     TestMainDatabase db = RoomAsset.databaseBuilder(frameworkContext, TestMainDatabase.class, "TestMainDatabase.db").allowMainThreadQueries().build(); 
     return db.featuresDao().findByName("title").getFeatureValue().toString(); 

    } 

方式二。儘可能隱藏。一切都必須傳遞給工具類。當被更多的Activity使用時如何處理這個問題。在utilitie類中使用靜態Activity聲明仍然可以嗎?

private static Context frameworkContext; 
private static Activity frameworkActivity; 
private static TestMainDatabase frameworkTestMainDatabase; 

public frameworkFeatures(Context context, Activity activity){ 

    frameworkContext = context; 
    frameworkActivity = activity; 

    TestMainDatabase.getDatabase(context); 
    frameworkTestMainDatabase = RoomAsset.databaseBuilder(frameworkContext,TestMainDatabase.class, "TestMainDatabase.db").allowMainThreadQueries().build(); 


} 

public static void frameworkSetTitleEverythingisStatic(){ 

    frameworkActivity.setTitle(frameworkTestMainDatabase.featuresDao().findByName("title").getFeatureValue().toString()); 

} 

回答

0

如果您需要有有效的上下文/活動,您可以改爲提供初始化API應該在ApplicationonCreate()被稱爲:

調用類:

frameworkFeatures(applicationContext,this) 
    frameworkFeatures.frameworkSetTitleEverythingisStatic() 

稱爲類。喜歡的東西:

Framework.initialize(appContext); 

其內部,你可以註冊自己的Application.ActivityLifecycleCallbacks,將跟蹤當前可見/主動活動:

public static void initialize(Application context) { 
    appContext.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() { 
     ... 
     @Override 
     public void onActivityResumed(Activity activity) { 
      sGlobalContext = activity; 
     } 
     @Override 
     public void onActivityPaused(Activity activity) { 
      sGlobalContext = null; 
     } 
     .... 
    ... 
} 

然後你的框架不應該擔心活動/語境了。對於用戶來說都是透明的。

+0

應該sGlobalContext是這個類中的靜態上下文變量。你不要擔心,我不必擔心了,因爲一次只有一項活動可以活躍。當我「清理」班級時,我沒有任何問題,當另一個Actitvity被調用時? – freeLearning

+0

當從非活動類中調用實用程序時。我可以打電話給他們只是沒有初始化? – freeLearning

+0

正確 - 你只需要初始化你的框架一次來註冊生命週期監聽器。然後直接使用你的'API'而不需要傳遞上下文。像'frameworkSetTitle'。 'frameworkSetTitle'將從'Framework'外觀中定義的封裝私有靜態getter方法中獲取它,其中上下文將被存儲在私有靜態變量'sGlobalContext'中 – j2ko

相關問題