我有一个用于Aquerytask的查询数据库管理器类:
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();
答案 0 :(得分:1)
您可以使用此模式
https://www.google.de/amp/s/www.geeksforgeeks.org/singleton-design-Patient tern / amp /
然后使用get实例。
但是如果您已经在使用Callbacks,我会考虑在没有返回值的情况下实现asyncTask。
尝试此链接
答案 1 :(得分:1)
要实现所需的功能,请摆脱构造函数并将静态回调更改为public。这样,您可以在调用任何其他静态方法之前在外部设置公共静态变量。带有所有静态成员的类中的构造函数是不必要的。
现在可以这么说,这种用于在Android中访问数据库的设计无法很好地扩展。在任何给定时间,DBManager只能有一个客户端。更好的方法是为需要此方法的任何方法传递回调,并删除静态变量回调。