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

时间:2018-11-24 18:25:53

标签: android

我有一个用于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();

2 个答案:

答案 0 :(得分:1)

您可以使用此模式

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

然后使用get实例。

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

尝试此链接

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

答案 1 :(得分:1)

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

现在可以这么说,这种用于在Android中访问数据库的设计无法很好地扩展。在任何给定时间,DBManager只能有一个客户端。更好的方法是为需要此方法的任何方法传递回调,并删除静态变量回调。