# Android-Init **Repository Path**: zengwenlong/android-init ## Basic Information - **Project Name**: Android-Init - **Description**: android项目初始化框架 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-10-18 - **Last Updated**: 2024-12-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 1. DataBinding【已完成】 2. EventBus【已完成】 3. OkHttp+retrofit【已完成】 4. BaseViewModel【已完成】 5. BaseRepository【已完成】 6. flow【已完成】 7. hilt【已完成】 8. 依赖的版本号如何抽离【已完成】 9. 数据库 【已完成】 10. 路由、组件化:Aroute【已完成】 11. 分包【已完成】 12. LeakCanary 13. Bugly 14. 图片框架 15. 优化项目:抽取共同项配置 #一、 OkHttp+retrofit (1)构建对象 /** * [OkHttpClient]依赖提供方法 * * @return OkHttpClient */ @Singleton @Provides fun provideOkHttpClient(): OkHttpClient { // 日志拦截器部分 // val level = if (BuildConfig.VERSION_TYPE != VersionStatus.RELEASE) BODY else NONE val logInterceptor = HttpLoggingInterceptor().setLevel(BODY) return OkHttpClient.Builder()// 1.使用内部工厂类 Builder 来设置 OkHttpClient .connectTimeout(15L * 1000L, TimeUnit.MILLISECONDS) // 2.这行代码设置了连接超时时间,如果15秒内无法建立连接,则会抛出超时异常。 .readTimeout(20L * 1000L, TimeUnit.MILLISECONDS)//3. 这行代码设置了读取超时时间,如果20秒内无法完成数据的读取,则会抛出超时异常。 .addInterceptor(logInterceptor)//4. 拦截器可以在请求发送前后或响应接收前后执行自定义操作,比如打印日志 .retryOnConnectionFailure(true)//5. 意味着如果网络连接失败,OkHttp会尝试自动重试。 .build() } /** * 项目主要服务器地址的[Retrofit]依赖提供方法 * * @param okHttpClient OkHttpClient OkHttp客户端 * @return Retrofit */ @Singleton @Provides fun provideMainRetrofit(okHttpClient: OkHttpClient): Retrofit { return Retrofit.Builder() .baseUrl(NetBaseUrlConstant.MAIN_URL) .addConverterFactory(ScalarsConverterFactory.create())//这行代码添加了一个转换工厂ScalarsConverterFactory,它用于将HTTP响应体转换为标量类型(如String、Integer等)。 .client(okHttpClient)//这行代码设置了用于网络请求的OkHttpClient实例。这个okHttpClient应该是在代码的其他地方创建并配置好的,可能包含了一些自定义的设置,比如超时时间、拦截器等。 .build() } (2)如何使用? @Module //声明一个@Module注解,表示这一个用于提供依赖注入实例的模块。 @InstallIn(SingletonComponent::class)//ilt 这个模块中定义的依赖项将被安装在应用程序的全局单例组件中。这意味着这些依赖项将在整个应用程序的生命周期内只被创建一次,并在所有需要它们的地方共享。 class DIHomeNetServiceModule { /** * Home模块的[HomeApiService]依赖提供方法 * * @param retrofit Retrofit * @return HomeApiService */ @Singleton//@Singleton 注解也用于 provideDatabase 方法上,以确保返回的 AppDatabase 实例是单例的。 @Provides//表示provideHomeApiService方法是一个提供依赖项的方法 fun provideHomeApiService(retrofit: Retrofit): HomeApiService { return retrofit.create(HomeApiService::class.java) } } 二、hilt (0)添加依赖和插件 如果没有插件,你会遇到各种问题。 Android 关于使用 Hilt 之 HiltAndroidApp(Application::class) 编译失败的问题解决 0x0000000 (1)创建提供依赖项的模块 /** * 全局作用域的Home组件网络接口代理依赖注入模块 * * @author Qu Yunshuo * @since 6/4/21 5:51 PM */ @Module //表示这一个用于提供依赖注入实例的模块。该模块定义了如何提供依赖项。在这个模块中,你可以定义方法来创建和提供对象实例。 @InstallIn(SingletonComponent::class)//这个模块中定义的依赖项将被安装在应用程序的全局单例组件中。这意味着这些依赖项将在整个应用程序的生命周期内只被创建一次,并在所有需要它们的地方共享。 class DIHomeNetServiceModule { /** * Home模块的[HomeApiService]依赖提供方法 * * @param retrofit Retrofit * @return HomeApiService */ @Singleton//@Singleton 注解也用于 provideDatabase 方法上,以确保返回的 AppDatabase 实例是单例的。 @Provides//表示provideHomeApiService方法是一个提供依赖项的方法,Dagger Hilt会调用这些方法来获取它们提供的依赖项。也就是@Inject能拿到依赖。 fun provideHomeApiService(retrofit: Retrofit): HomeApiService { return retrofit.create(HomeApiService::class.java) } } (2)那么如何使用呢? @Inject lateinit var mApi: HomeApiService 注意,如果只是添加这个,还无法让hilt找到他。会报错:lateinit property mApi has not been initialized 需要提供一个入口给他找到。activity就提供@AndroidEntryPoint @AndroidEntryPoint class MainActivity : BaseActivity() {