首页 > 解决方案 > 如何在 Android Hilt-dagger 中为 Web Socket Connection 维护 Singleton 类?

问题描述

我是 Android Dagger-Hilt 的新手,我发现它对我的项目很有用。然而,最近我想用这个概念让我的ServerConnection班级成为跨越不同视图(片段和活动)的单例。我怎样才能做到这一点?

我试图在下面接近,但我无法得到它 Singleton,因为它会ServerConnection在我的片段/活动视图中创建 2 个实例。我哪里做错了?

目前的方法

应用模块.kt

@Singleton
@Provides
fun provideSocketConnection(tokenDao: TokenDao) : ServerConnection{
    val token = runBlocking(Dispatchers.IO) { tokenDao.find() }
    val tok = token!!.token
    val refreshToken = token.refresh_token
    return ServerConnection(URL)
}

服务器连接.kt

class ServerConnection(url: String) {
    enum class ConnectionStatus {
        DISCONNECTED, CONNECTED
    }

    interface ServerListener {
        fun onNewMessage(message: String?)
        fun onStatusChange(status: ConnectionStatus?)
    }
    

    private var mWebSocket: WebSocket? = null
    private val mClient: OkHttpClient
    private val mServerUrl: String
    private var mMessageHandler: Handler? = null
    private var mStatusHandler: Handler? = null
    private var mListener: ServerListener? = null

    init {
        mClient = OkHttpClient.Builder()
            .readTimeout(3, TimeUnit.SECONDS)
            .retryOnConnectionFailure(true)
            .build()
        mServerUrl = url
    }

    private inner class SocketListener : WebSocketListener() {
        override fun onOpen(webSocket: WebSocket, response: Response) {
            val m = mStatusHandler!!.obtainMessage(0, ConnectionStatus.CONNECTED)
            mStatusHandler!!.sendMessage(m)
        }

        override fun onMessage(webSocket: WebSocket, text: String) {
            val m = mMessageHandler!!.obtainMessage(0, text)
            mMessageHandler!!.sendMessage(m)
        }

        override fun onClosed(
            webSocket: WebSocket,
            code: Int,
            reason: String
        ) {
            val m =
                mStatusHandler!!.obtainMessage(0, ConnectionStatus.DISCONNECTED)
            mStatusHandler!!.sendMessage(m)
        }

        override fun onFailure(
            webSocket: WebSocket,
            t: Throwable,
            response: Response?
        ) {
            disconnect()
        }
    }

    fun connect(listener: ServerListener?) {
        val request = Request.Builder()
            .url(mServerUrl)
            .build()
        mWebSocket = mClient.newWebSocket(request, SocketListener())
        mListener = listener
        mMessageHandler =
            Handler(Handler.Callback { msg: Message ->
                mListener?.onNewMessage(msg.obj as String)
                true
            })
        mStatusHandler = Handler(Handler.Callback { msg: Message ->
            mListener!!.onStatusChange(msg.obj as ConnectionStatus)
            true
        })
    }

    fun disconnect() {
        mWebSocket?.cancel()
        mListener = null
        mMessageHandler?.removeCallbacksAndMessages(null)
        mStatusHandler?.removeCallbacksAndMessages(null)
    }

    fun sendMessage(message: String?) {
        mWebSocket!!.send(message!!)
    }

    
}

查看(片段/活动)

@AndroidEntryPoint
class RoomFragment : Fragment(), ServerConnection.ServerListener {
    
    @Inject lateinit var socketConnection: ServerConnection

}

标签: androiddagger-hilt

解决方案


你需要用 注释你的AppModule.kt@InstallIn(SinggltonComponent::class)

要了解有关刀柄组件的更多信息,请在此处查看此详细信息。


推荐阅读