【问题标题】:Best way to build an UI utility class构建 UI 实用程序类的最佳方法
【发布时间】:2018-01-13 12:32:48
【问题描述】:

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

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

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

方法之一!与 Activity 相关的一切都在调用 Activity 中完成。上下文通过构造函数传递,也可以在每个函数调用中调用。 在我看来,我们确实没有那么多依赖项,但实用程序用户必须自己做很多事情。

调用类:

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 使用时如何处理。在实用程序类中使用静态 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());

}

【问题讨论】:

    标签: java android android-activity architecture utilities


    【解决方案1】:

    如果您需要有效的上下文/活动,您可以改为提供应该在ApplicationonCreate() 中调用的初始化 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; 
           }
           ....
        ...
    }
    

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

    【讨论】:

    • sGlobalContext 应该是这个类中的静态上下文变量。您是否感到不安,我不必再担心了,因为一次只能激活一个活动。当我“清理”类我没有问题时,什么时候会调用另一个 Activity?
    • 从非活动类调用实用程序时。我可以在不初始化的情况下调用它们吗?
    • 正确 - 您只需初始化一次框架即可注册生命周期侦听器。然后直接使用您的API,无需传递上下文。喜欢frameworkSetTitleframeworkSetTitle 将从 Framework 外观中定义的包私有静态 getter 方法中获取它,其中上下文将存储在私有静态变量 sGlobalContext
    猜你喜欢
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多