YmBok
搜索 充值水晶

在项目中使用Hilt Retrofit使用总结


直接开始,首先我们看看怎么使用Hilt编写Retrofit接口请求类

用@Provides注解定义可注入的实例的提供者函数,如:provideHttpClient()用于提供OkHttpClient的实例,provideRetrofit()用于提供Retrofit实例

provideUserService()用于提供UserService的实例,这样我们就可以在其他的类里用@Inject获取注入该实例了。

完整代码:

@Module
@InstallIn(SingletonComponent::class)
/** 单例 */
object RetrofitModule {

    /** 服务地址 */
    private const val BASE_URL = Constant.SERVER_ADDRESS

    /** 提供OkHttpClient */
    @Singleton
    @Provides
    fun provideHttpClient(): OkHttpClient {
        return OkHttpClient.Builder()
                .addInterceptor(LoggingInterceptor())
                .addInterceptor(HeaderInterceptor())
                .addInterceptor(BasicParamsInterceptor())
                .build()
    }

    /** 提供Retrofit */
    @Singleton
    @Provides
    fun provideRetrofit(httpClient: OkHttpClient): Retrofit {
        val builder = Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(httpClient)
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(GsonBuilder().registerTypeAdapterFactory(
                        GsonTypeAdapterFactory()
                ).create()))

        return builder.build()
    }

    /** 用hilt就不用这种创建对象的方式了 */
    fun <T> create(serviceClass: Class<T>): T = provideRetrofit(provideHttpClient()).create(serviceClass)

    /** 提供服务 */
    @Singleton
    @Provides
    fun provideUserService(retrofit: Retrofit): UserService = retrofit.create(UserService::class.java)


    /** 日志拦截器 */
    class LoggingInterceptor : Interceptor {

        @Throws(IOException::class)
        override fun intercept(chain: Interceptor.Chain): Response {
            val request = chain.request()
            val t1 = System.nanoTime()

            //logV(TAG, "发送请求: ${request.method()} ${request.url()} ${request.headers()}")

            logV(
                    TAG, String.format("发送请求 %s on %s%n%s",
                    request.url(), request.method(), request.headers()));

            val response = chain.proceed(request)

            val t2 = System.nanoTime()
            //logV(TAG, "Received response for  ${response.request().url()} in ${(t2 - t1) / 1e6} ms\n${response.headers()}")
            val responseBody: ResponseBody = response.peekBody((1024 * 1024).toLong())
            logV(
                    TAG,
                    String.format(
                            "接收响应: [%s] %n返回json:【%s】 %.1fms%n%s",
                            response.request().url(),
                            responseBody.string(),
                            (t2 - t1) / 1e6,
                            response.headers()
                    )
            )

            return response
        }

        companion object {
            const val TAG = "LoggingInterceptor"
        }
    }

    /** 增加Header */
    class HeaderInterceptor : Interceptor {
        override fun intercept(chain: Interceptor.Chain): Response {
            val original = chain.request()
            val request = original.newBuilder().apply {
                header("model", "Android")
                header("If-Modified-Since", "${Date()}")
                header("User-Agent", System.getProperty("http.agent") ?: "unknown")
                MyApplication.instance().token?.apply {
                    header("token", MyApplication.instance().token!!)
                }

            }.build()
            return chain.proceed(request)
        }
    }

    /** 公共参数 */
    class BasicParamsInterceptor : Interceptor {
        override fun intercept(chain: Interceptor.Chain): Response {
            val originalRequest = chain.request()
            val originalHttpUrl = originalRequest.url()
            val url = originalHttpUrl.newBuilder().apply {
                addQueryParameter("version", "${Build.VERSION.SDK_INT}")
            }.build()
            val request = originalRequest.newBuilder().url(url).method(originalRequest.method(), originalRequest.body()).build()
            return chain.proceed(request)
        }
    }
}

定义UserService接口

interface UserService {

    /**
     * 获取用户信息
     */
    @GET("/user/info")
    suspend fun userInfo(@Query("userId") userId:String): ServiceResult<User>

}

接着我们定义Repository的提供类,提供UserRepository类的实例

@Module
@InstallIn(ActivityComponent::class)
object RepositoryModule {

    @ActivityScoped
    @Provides
    fun provideUserRepository(userService: UserService):UserRepository {
        return UserRepository(userService)
    }

}

到目前为止我们定义了UserRepository  UserService的实例提供

下面就是怎么在Activity和ViewModel中使用UserRepository  UserService的实例

通过@HiltViewModel   @Inject 在构造函数中注入userRepository

@HiltViewModel
class LoginViewModel @Inject constructor(private val userRepository: UserRepository): ViewModel() {
    .............
}

在Activity中定义ViewModel,在Activity上增加@AndroidEntryPoint 

@AndroidEntryPoint
class LoginActivity : BaseActivity() {  private val loginViewModel: LoginViewModel by viewModels()
}

在Application中增加@HiltAndroidApp注解

@HiltAndroidApp
class MyApplication : Application(){
}

以上。





内容来源与作者发布和网络,如有版权相关问题请及时与我们取得联系,我们将立即删除。

关于作者

还如一梦中 点击这里给我发消息

相关推荐

希望你会喜欢本站的内容

能用于cocos2d-x NDK的wstring和string的转换代码

std::string WString2String(const std::wstring&amp; wstr){ std::string curLocale = setlocale(LC_AL

2022-12-19 还如一梦中
《传奇世界》手游修改教程之怪物掉落设置

下面讲解如何修改传世世界手游中的物品掉落,再原始的版本中,掉落的设置无法满足玩家的喜欢,我们需要自己修改,有简单的方法,也有费时的方法,先教大家基础的方法,后面教大家快捷的方法。 首先再客户

2022-07-06 还如一梦中
《传奇世界》手游修改教程之道士BB召唤

道士控制自己技能召唤的宝宝,服务端/data/sbin/resource/script/system/skill 打开SkillScript.lua --新的道士宝宝召唤机制 SkillSc

2022-07-06 还如一梦中
《传奇世界》手游修改教程之攻沙时间修改

客户端和服务端ShaWarDB,关键的字段是时间逗号后面那个数字: --攻沙时间设置 改为3天后 local Items = { {holdTimes = 5,defensePos = '{x

2022-07-06 还如一梦中
《传奇世界》手游修改教程之Luac4加密

Lua是游戏的脚本一般不会直接打包到app里,要先加密为luac4,在传奇世界手游里android可以支持luac4,但苹果不行 我们通过lua编译工具(tools/luaecode)编译l

2022-07-06 还如一梦中
《一梦传世》元神版本纯源码手工编译教程

《一梦传世》 元神 版本纯源码手工编译 全部文件包含服务端与客户端(其中包含AndroidStudio工程,Eclipse工程,IOS工程)目录如下: 分别稍稍下目录内容: ymwe

2022-07-06 还如一梦中
白鹭冰雪源码编译服务端VIP教程

2022-07-02 还如一梦中
白鹭冰雪源码编译客户端VIP教程

2022-07-02 还如一梦中
刺客传奇引擎架设教程

荐服务端系统环境 Win Server 2008 64位 一、将服务端拷贝到服务器,解压YmcqServer.zip。 二、安装64位DBC2000: 安装DBC_2000,安装成功后打开安装目录,

2022-06-07 还如一梦中
刺客引擎编译打包修改免费视频教程(六)

6、delphi引擎服务端编译

2022-06-07 还如一梦中

友情链接