我想构建一个实用工具类。它应该从数据库读取值,提供典型的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());
}
答案 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;
}
....
...
}
然后您的框架不再担心活动/上下文了。对于用户来说,一切都是透明的。