android - 如何在 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
}
解决方案
你需要用 注释你的AppModule.kt
类@InstallIn(SinggltonComponent::class)
。
要了解有关刀柄组件的更多信息,请在此处查看此详细信息。
推荐阅读
- python - 如何在此 python 代码上获得更好的性能
- python - 如何使用 Python 关闭终端?
- java - 当 Hibernate 从 4.x 升级到 5.x 和 Spring 4.x for Multi-Threaded 时出现 ConcurrentModificationException
- java - Apache Spark:有没有办法在 spark 中读取 CSV 文件并将它们直接转换为 Byte[] 而无需将文件保存在任何地方
- c# - C# 中的 MS Dynamics Query 审计返回 EntityReference 而不是名称
- sql-update - Sequelize 模型仅在我注销然后重新登录时更新
- powershell - 使用powershell,如何从客户端修改和保存客户端outlook规则?
- python - 如何比较两个图中的节点和边?
- android - 设备突然停止接收 Firebase 数据消息
- json - 如何从网页中查找元素并将其导入 Google 表格单元格?