构建 UI 实用程序的最佳方式 class
Best way to build an UI utility class
我想构建一个实用程序 class。它应该从数据库中读取值并提供典型的 UI 或交互功能,例如设置应用标题,设置背景图片,播放背景音乐。
因为问了另一个问题 我意识到我有很多不同的方法可以做到这一点。我测试了不同的方法来设置标题,每种方法都有效。但哪种方式最干净/正确/自信,为什么?
在示例中调用 class 是 kotlin class,但这无关紧要。
方法一! Activity 相关的一切都在调用 activity 中完成。上下文通过构造函数传递,也可以在每次函数调用时调用。
在我看来,我们确实没有那么多依赖性,但实用程序用户必须自己做很多事情。
呼叫class:
frameworkFeatures(applicationContext);
setTitle(frameworkFeatures.frameworkSetTitlesStaticContext());
呼叫 class:
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();
}
方式二。尽量躲起来。一切都必须传递给实用程序 class。当被 more Activity 使用时如何处理这个问题。在实用程序 class 中使用静态 Activity 声明是否仍然可行?
呼叫 class:
frameworkFeatures(applicationContext,this)
frameworkFeatures.frameworkSetTitleEverythingisStatic()
呼叫 class:
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());
}
如果您需要有效的 context/activity,您可以改为提供应在 Application
onCreate()
中调用的初始化 API。像 :
Framework.initialize(appContext);
您可以在其中注册您自己的 Application.ActivityLifecycleCallbacks
以跟踪当前 visible/active activity:
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;
}
....
...
}
然后你的框架就不用再担心 activity/context 了。对于用户,一切都是透明的。
我想构建一个实用程序 class。它应该从数据库中读取值并提供典型的 UI 或交互功能,例如设置应用标题,设置背景图片,播放背景音乐。
因为问了另一个问题
在示例中调用 class 是 kotlin class,但这无关紧要。
方法一! Activity 相关的一切都在调用 activity 中完成。上下文通过构造函数传递,也可以在每次函数调用时调用。 在我看来,我们确实没有那么多依赖性,但实用程序用户必须自己做很多事情。
呼叫class:
frameworkFeatures(applicationContext);
setTitle(frameworkFeatures.frameworkSetTitlesStaticContext());
呼叫 class:
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();
}
方式二。尽量躲起来。一切都必须传递给实用程序 class。当被 more Activity 使用时如何处理这个问题。在实用程序 class 中使用静态 Activity 声明是否仍然可行?
呼叫 class:
frameworkFeatures(applicationContext,this)
frameworkFeatures.frameworkSetTitleEverythingisStatic()
呼叫 class:
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());
}
如果您需要有效的 context/activity,您可以改为提供应在 Application
onCreate()
中调用的初始化 API。像 :
Framework.initialize(appContext);
您可以在其中注册您自己的 Application.ActivityLifecycleCallbacks
以跟踪当前 visible/active activity:
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;
}
....
...
}
然后你的框架就不用再担心 activity/context 了。对于用户,一切都是透明的。