异步/非主线程初始化Hilt?



我目前有这个代码在我的应用程序模块:

@Singleton
@Provides
fun provideMsalClient(@ApplicationContext context: Context): ISingleAccountPublicClientApplication {
// ISSUE: this does NOT work, as the createSingleAccountPublicClientApplication method
// may not be called from the main thread
return PublicClientApplication.createSingleAccountPublicClientApplication(
context,
R.raw.msal_config
)
}

当我从运行时的异常中了解到,PublicClientApplication.createSingleAccountPublicClientApplication(Microsoft身份验证库的一部分,但我的问题是一般性的)可能不会从主线程调用。

那么,使用Hilt,我如何在主线程/异步之外创建对象?

javax.inject.Provider在你想要注入类的地方?当你用Provider注入它时,它不会崩溃。你只需要确保,你不会调用.get()

这是一个极简主义的例子。

用来模拟问题的类:

import android.os.Looper
class PublicClientApplication {
fun createSingleAccountPublicClientApplication(): ISingleAccountPublicClientApplication {
throwOnMainThread("create")
return ISingleAccountPublicClientApplication()
}
private fun throwOnMainThread(methodName: String) {
check(Looper.myLooper() != Looper.getMainLooper()) { "method: $methodName may not be called from main thread." }
}
// just to make it compact here
class ISingleAccountPublicClientApplication {
fun foo() {
println("Bla")
}
}
}

dagger绑定代码:

@Singleton
@Provides
fun provideISingleAccountPublicClientApplication(): ISingleAccountPublicClientApplication {
return PublicClientApplication().createSingleAccountPublicClientApplication()
}

As字段注入:

import javax.inject.Inject
import javax.inject.Provider
...

@Inject
lateinit var singleAccountPublicClientApplication: Provider<ISingleAccountPublicClientApplication>

带构造函数注入:

import javax.inject.Inject
import javax.inject.Provider
class MyServiceClass @Inject constructor(
@Inject private val accountPublicClientApplication: Provider<ISingleAccountPublicClientApplication>
) {
fun doSomethingAuthenticatedWhichWontBeCalledOnMainThread() {
accountPublicClientApplication.get().foo()
}
}

最新更新