android 如何在SocketIO中使用Hilt中的最新accessToken?

lh80um4z  于 2024-01-04  发布在  Android
关注(0)|答案(1)|浏览(117)

我正在使用Hilt和实现socket。
下面是用于创建仓库的仓库模块。

  1. @Module
  2. @InstallIn(SingletonComponent::class)
  3. object RepositoryModule {
  4. @Provides
  5. fun provideSocketRepository(socket: Socket): SocketRepository {
  6. return SocketRepository(socket)
  7. }
  8. }

字符串
这里的ServiceModule用于将Socket注入SocketRepository。

  1. @Module
  2. @InstallIn(SingletonComponent::class)
  3. object ServiceModule {
  4. @Provides
  5. fun provideSocket(): Socket {
  6. logd("socket: accessToken: ${Common.accessToken}")
  7. val options = IO.Options().apply {
  8. timeout = 30000
  9. reconnection = true
  10. reconnectionDelay = 1000
  11. reconnectionAttempts = 300
  12. transports = arrayOf(WebSocket.NAME)
  13. extraHeaders = mapOf(
  14. "Authorization" to listOf("Bearer ${Common.accessToken}"),
  15. "Content-Type" to listOf("application/json"),
  16. "identity" to listOf("app")
  17. )
  18. }
  19. return IO.socket(UrlType.BACK_OFFICE_SERVER.getUrl(), options)
  20. }
  21. }


问题是

  1. Common.accessToken是全局变量,需要重构,登录后也会更新。但是整个应用进程全局需要Socket,所以时间是在注入之后。如何使用hilt获取最新的accessToken?
    1.我应该在某些时候以编程方式连接和断开Socket。如果我使用hilt,它将继续注入到repo类。当我尝试断开它时,示例是否可以存活?例如,socket.disconnect没有socket = null,然后socket.connect在需要连接时重新连接Socket。
pbwdgjma

pbwdgjma1#

在你的例子中,Socket不应该被注入,而是被 Package 在一个Manager类中,这个类将处理逻辑并被注入到存储库中。
你可以有一个单例AuthManager类来控制登录和令牌流(你可以自己定义模块):

  1. class AuthManager @Inject constructor() {
  2. val token = MutableStateFlow<String?>(null)
  3. suspend fun signIn() {
  4. // Do sign in stuff, then update your token
  5. token.emit(newToken)
  6. }
  7. }

字符串
然后你的SocketManager类有AuthManager作为依赖项:

  1. class SocketManager @Inject constructor(authManager: AuthManager) {
  2. val socket = MutableStateFlow<Socket?>(null)
  3. init {
  4. authManager.token.collect {
  5. // Token updated, recreated your socket here and emit new socket to collector
  6. socket.emit or socket.trySend
  7. }
  8. }
  9. }


SocketManager也是Singleton(你可以自己定义模块)
最后,在任何你想使用套接字的地方,比如在Activity中,注入SocketManager并根据需要收集套接字:

  1. @AndroidEntryPoint
  2. class MyActivity: AppCompatActivity {
  3. @Inject
  4. lateinit var socketManager: SocketManager
  5. fun onCreate() {
  6. lifecycleScope.launch {
  7. repeatOnLifecycle(Lifecycle.State.STARTED) {
  8. socketManager.socket.collect {
  9. // Use your socket here, socket will be changed after token changed and this code block is called
  10. }
  11. }
  12. }
  13. }
  14. }

展开查看全部

相关问题