我正在尝试将我的用户对象存储为Dagger 2的单例。
@Provides
@Named("me")
@Singleton
User provideUser(PrefsUtil prefsUtil, UserDao userDao) {
int id = prefsUtil.getFromPrefs("me", 0);
if (id == 0){
return new User();
}
try {
return userDao.queryForId(id);
} catch (SQLException e) {
return new User();
}
}
它工作正常,并使用User对象注入我的类。
但是,在从服务器登录并从服务器获取用户并将其存储在上述方法查询的位置之后,它将不会生效,因为它是单例。它将为我提供null用户对象。为了使它生效,你必须退出应用程序并重新打开它......
问题是如何在实际数据更改后更新/重新初始化用@Name(" me")注释的用户对象,以便用当前用户对象注入我的其他类?
答案 0 :(得分:3)
然后它不再可以使用Singleton
进行注释。您必须创建自定义Scope。
然后,您对使用自定义范围注释的对象负责。一旦您的User
更新,您就会摆脱提供User
对象的前一个组件,即将其清空。然后,您正在创建一个新组件,下次当您要求组件获取User
时,它将创建一个新组件。
请注意,模块中使用自定义作用域注释的任何其他提供程序方法也将返回新创建的对象。
Here's一篇描述如何做到这一点的博客文章。
答案 1 :(得分:2)
我不会回答您的直接问题,但会就如何正确实施您需要的功能提供建议。
您基本上是在尝试实现某种UserManager
功能。但是,不是将此逻辑封装在专用类中,而是尝试将用户管理职责委派给DI框架。
这是滥用DI框架和非常草率的道路。
你需要的就是这个:
@Provides
@Singleton
UserManager provideUserManager(PrefsUtil prefsUtil, UserDao userDao) {
return new UserManager(prefUtils, userDao);
}
并在UserManager
中公开所需的功能:
public class UserManager {
private final PrefsUtil mPrefsUtil;
private final UserDao mUserDao;
public UserManager(PrefsUtil prefsUtil, UserDao userDao) {
mPrefsUtil = prefsUtil;
mUserDao = userDao;
}
public User getCurrentUser() {
int id = mPrefsUtil.getFromPrefs("me", 0);
if (id == 0){
return new User();
}
try {
return mUserDao.queryForId(id);
} catch (SQLException e) {
return new User();
}
}
}
您可以看到this和this个答案,以获得有关DI框架滥用的其他背景信息。
您可能还想阅读这篇文章:Dependency Injection in Android。