Application 单例 → Hilt Singleton

Application 单例 → Hilt Singleton

老写法(Java --- Application 单例容器)

java 复制代码
public class App extends Application {
    private static App instance;
    private ApiService apiService;
    private UserManager userManager;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
        apiService = createApi();
        userManager = new UserManager(apiService);
    }

    public static App get() { return instance; }
    public ApiService getApi() { return apiService; }
    public UserManager getUserManager() { return userManager; }
}

// 使用
App.get().getUserManager().login();

问题在哪里

Application 变成上帝对象,所有依赖都堆在一个类里。无法做作用域区分------有些依赖应该是单例,有些应该跟随 Activity/Fragment 生命周期,但全放在 Application 里就都是永久存活。

新写法(Hilt Singleton)

kotlin 复制代码
// Singleton 生命周期
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
    @Provides @Singleton
    fun provideOkHttp(): OkHttpClient = OkHttpClient.Builder().build()

    @Provides @Singleton
    fun provideRetrofit(client: OkHttpClient): Retrofit =
        Retrofit.Builder().baseUrl("...").client(client).build()

    @Provides @Singleton
    fun provideApi(retrofit: Retrofit): ApiService =
        retrofit.create(ApiService::class.java)

    @Provides @Singleton
    fun provideUserManager(api: ApiService): UserManager = UserManager(api)
}

// Activity 生命周期
@Module
@InstallIn(ActivityComponent::class)
object ActivityModule {
    @Provides @ActivityScoped
    fun provideNavigator(activity: Activity): Navigator = Navigator(activity)
}

一句话注意

Hilt 的 @Singleton 作用域:单例在整个应用生命周期存活。@ActivityScoped 只在单个 Activity 生命周期内共享同一个实例,Activity 销毁后实例也释放。@ViewModelScoped 跟 ViewModel 同生命周期,ViewModel 清除时释放。

Application 单例模式迁移到 Hilt 的核心变化:从命令式获取(App.get().getApi())变成声明式注入(@Inject constructor),不需要自己管理实例的生命周期。


Java Android 老项目迁移系列,持续更新中。

相关推荐
程序 代码狂人10 分钟前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
警醒与鞭策1 小时前
Codex桌面版与Claude桌面版使用设置
android·unity·ai·性能优化
2501_944521591 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
南归北隐2 小时前
Spring AI Alibaba Graph框架实现MCP数据库查询实战
java·后端·spring ai·mcp·spring ai mcp
古法老登瞎折腾2 小时前
大数据智能运维实战(九):让 AI 查日志——找到异常,也保留上下文
java·大数据·运维·人工智能·spring ai·mcp
ai大模型-探索者3 小时前
Function Call与MCP(区别、联系与实战)
java·服务器·网络
略略略咯咯3 小时前
啊啊啊啊啊
java·服务器·数据库
SL_staff3 小时前
运维救火实战:钉钉API变更致薪资计算中断,如何用可视化逻辑引擎5分钟热修复
java·开源·全栈
猫猫.1533 小时前
HashTable、HashMap、ConcurrentHashMap 核心区别总结
java·开发语言·java-ee
传奇开心果4 小时前
【Compose Multiplatform跨端声明式UI实用技术】第19课:多平台部署与发布
android·kotlin