构建UI实用程序类的最佳方法

时间:2017-08-05 20:06:49

标签: java android android-activity architecture utilities

我想构建一个实用工具类。它应该从数据库读取值,提供典型的UI或交互功能,例如设置应用程序的标题,设置背景图片,播放背景音乐。

因为问了另一个问题How to use UI functions in non UI methods?我意识到我有很多不同的方法来做到这一点。我测试了不同的方法来设置每个,每种方式都有效。但这是最干净/正确/自信的方式,为什么?

在示例中,调用类是kotlin类,但这是无关紧要的。

方式一!与活动相关的所有活动都在调用活动中完成。 Context通过构造函数传递,也可以随每个函数调用调用。 在我看来,我们在这里没有那么多的依赖,但实用程序用户必须自己做很多事情。

调用类:

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声明?

调用类:

    frameworkFeatures(applicationContext,this)
    frameworkFeatures.frameworkSetTitleEverythingisStatic()

叫做课程:

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());

}

1 个答案:

答案 0 :(得分:0)

如果您需要拥有有效的上下文/活动,则可以提供应在Application onCreate()中调用的初始化API。类似的东西:

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; 
       }
       ....
    ...
}

然后您的框架不再担心活动/上下文了。对于用户来说,一切都是透明的。