Singleton在类中使用静态函数和回调的正确方法



我有一个数据库管理器类用于我的查询,它使用Asynctask:运行

public class DBManager {
private static DBCallback dbCallback;
//I need this for callbacks to main class when operation is finished
public DBManager(DBCallback mClass) {
this.dbCallback = mClass;
}

public static void getAllUsers() {
new AsyncTask<Void, Void, List<UserDB>>() {
@Override
protected List<UserDB> doInBackground(Void... voids) {
return DatabaseClient.getInstance(ApplicationContextProvider.getContext()).getAppDatabase().userDao().getAll();
}
@Override
protected void onPostExecute(List<UserDB> users) {
super.onPostExecute(users);
dbCallback.finishedReadFromDB(users); //Sending callback
}
}.execute();
}
public static void deleteUserLocal(final UserDB user) {
new AsyncTask<UserDB, Void, Void>() {
@Override
protected Void doInBackground(UserDB... users) {
DatabaseClient.getInstance(ApplicationContextProvider.getContext()).getAppDatabase().userDao().delete(users[0]);
return null;
}
}.execute(user);
}
}

在我的MainClass上,我使用

dbManager = new DBManager(this);

用于接收回调,所以我使用

dbManager.getAllUsers();

然后在操作完成时得到回调。

但我有一些虚构的东西,我不需要返回deleteUserLocal之类的东西。所以我可以使用以太

dbManager.deleteUserLocal(user)

DBManager.deleteUserLocal(user)

因此,函数是静态的。

来自不需要回调的类当然我使用

DBManager.deleteUserLocal(user)

所以。。。我不喜欢每次在onCreate上我都会对DBManager进行新的说明:

dbManager = new DBManager(this);

只是为了回电。我如何创建一个可以用于回调并且只使用的单例类

DBManager.getAllUsers((;而不是dbManager.getAllUsers((;

要实现您想要的,请去掉构造函数并将静态回调更改为public。这样,您就可以在调用任何其他静态方法之前从外部设置公共静态变量。具有所有静态成员的类中的构造函数是不必要的。

话虽如此,这种在安卓系统中访问数据库的设计不会很好地扩展。DBManager在任何给定时间只能拥有一个客户端。更好的方法是传入任何需要回调的方法的回调,并丢弃静态变量回调。

您可以使用此模式

https://www.google.de/amp/s/www.geeksforgeeks.org/singleton-design-Patienttern/amp/

然后使用get实例。

但是,如果您已经在使用回调,我会考虑在没有返回值的情况下实现asyncTask。

尝试此链接

https://de.m.wikibooks.org/wiki/Muster:_Java:_Singleton

最新更新