gpt4 book ai didi

java - Dagger 2重新初始化单例

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:53:25 27 4
gpt4 key购买 nike

我正在尝试使用 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 对象注入(inject)我的类。

但是,登录并从服务器获取用户并将其存储在上述方法查询的地方后,它不会生效,因为它是单例。它将为我提供空用户对象。为了使其生效,您必须退出应用程序并重新打开它...

问题是如何在实际数据更改后更新/重新初始化用@Name("me") 注释的用户对象,以便它用当前用户对象注入(inject)我的其他类?

最佳答案

我不会直接回答您的问题,但会为您提供如何正确实现所需功能的建议。

您基本上是在尝试实现某种UserManager 功能。但是,您没有将此逻辑封装在专用类中,而是尝试将用户管理职责委托(delegate)给 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();
}
}
}

可以看到thisthis答案以获得有关 DI 框架滥用的一些额外背景信息。

您可能还想阅读这篇文章:Dependency Injection in Android .

关于java - Dagger 2重新初始化单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42091781/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com