【发布时间】:2019-11-08 09:59:49
【问题描述】:
我正在开发一个使用一些后台任务 (AsyncTasks) 的 Android 应用,我想使用有关跨应用生命周期和任务回调的数据持久性的最佳实践。
到目前为止,我对此有多种做法:
1) 我在类中有一些静态字段,其中 AsyncTasks 以下列形式使用:
private static String str1;
private static String str2;
private static int int1;
...//=>no more than 6 static fields
2) 我使用带有许多 getter/setter 的 sinleton App 实例,其形式为:
package xxx.xxx.xxx
import xxx.xxx.xxx
...
public class AppSettings {
private static AppSettings singleton;
private String _field1;
...//=>many fields
public void setField1(String field1) { _field1 = field1; }
public String getField1() { return _field1; }
...//=>many getters/setters
private AppSettings() {}
public AppSettings getInstance(){
if (instance== null) {
synchronized(AppSettings.class) {
if (instance == null)
instance = new AppSettings();
}
}
return instance;
}
}
我绝对知道滥用静态字段一点都不好,所以我决定全部替换它们,但我不完全确定我的第二种方法 - 在具有许多 getter/setter 的单例中拥有一个应用程序实例 -被认为是一个好方法,如果不是,我想知道更好的选择。
非常感谢。
编辑 1:只是为了澄清。
为了让你更清楚地了解我使用我的 AppSettings 单例类,我给你举两个例子:
1) 我使用它来存储应用程序设置/配置值(这就是名称的原因),以便在任何地方都可用。例如,字体颜色、字体大小等等。
2) 我用它来存储临时数据/值。例如,我的主要活动使用“VideoHelper”类在背景中创建一个小视频并通过 AsyncTask 调用,并且由于视频生成过程需要来自主要活动的一些参数,我使用 AppSettings 的 getter/setter 来发送它们。
编辑 2:更好地解释一切。
感谢@a_local_nobody,我意识到我的“使用案例”不是很清楚,所以我会添加更多内容。
我的 AppSettings 没有用于存储用户设置,我使用 SharedPreferences 来存储用户设置,而是使用应用默认配置参数。
举个例子,我存储活动背景颜色(这只是一个例子),所以如果将来我改变主意并决定使用另一种背景颜色,这个设置(以及更多)集中在那里。它就像许多默认应用设置的“容器”。
关于在这个应用程序单例类中使用 getter 和 setter,我想我会遵循 @a_local_nobody 的建议,在每个类中定义一些静态变量并根据需要使用它们,而不是在全局范围内使用一堆不相关的 getter/setter .
无论如何,欢迎所有的cmets。
【问题讨论】:
-
你应该尽量避免一般的异步任务,因为它们可能很快就会被弃用——旁注
-
感谢您的贡献@a_local_nobody。我使用 AsyncTaks 进行网络操作,例如下载文件或通过 api 获取令牌 id(例如),这是强制性的,您不能在主线程中运行网络操作,那么 AsyncTask 的替代方案是什么?为什么你认为它可能很快就会被弃用?
-
看看 RxJava 或 Coroutines,异步任务很适合刚开始,但显然它们很快就会被弃用:xda-developers.com/asynctask-deprecate-android-11
标签: android android-asynctask singleton persistence instance