gpt4 book ai didi

Android WorkManager - 我可以将输入数据传递给定期运行的 Worker 吗?

转载 作者:行者123 更新时间:2023-12-05 04:45:44 28 4
gpt4 key购买 nike

在我的应用程序中,我启动了一个每 15 分钟定期运行一次的 WebSocketWorker 任务。顾名思义,它包含一个用于在后台监听套接字的 WebSocket:

// MainApplication.kt
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) {
Timber.plant(DebugTree())
}

val work = PeriodicWorkRequestBuilder<WebSocketWorker>(15, TimeUnit.MINUTES).build()
workManager.enqueueUniquePeriodicWork("UniqueWebSocketWorker", ExistingPeriodicWorkPolicy.KEEP, work)
}

WebSocketWorker 包含以下逻辑:

@HiltWorker
class WebSocketWorker @AssistedInject constructor(
@Assisted appContext: Context,
@Assisted workerParams: WorkerParameters
) : CoroutineWorker(appContext, workerParams) {

inner class MyWebSocketListener : WebSocketListener() {
override fun onMessage(webSocket: WebSocket, text: String) {
Timber.d("The message sent is %s", text)
// do sth. with the message
}

override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
t.localizedMessage?.let { Timber.e("onFailure: %s", it) }
response?.message?.let { Timber.e("onFailure: %s", it) }
}
}


override suspend fun doWork(): Result {
try{
// code to be executed
val request = Request.Builder().url("ws://***.***.**.***:8000/ws/chat/lobby/").build()
val myWebSocketListener = MyWebSocketListener()
val client = OkHttpClient()
client.newWebSocket(request, myWebSocketListener)
return Result.success()
}
catch (throwable:Throwable){
Timber.e("There is a failure")
Timber.e("throwable.localizedMessage: %s", throwable.localizedMessage)
// clean up and log
return Result.failure()
}
}

}

如您所见,我在 Worker 类中设置了 WebSocket,一切正常。监听套接字有效。

现在,我还想在我的应用程序中添加“发送消息”功能。如何重用在 WebSocketWorker 中创建的 websocket?我可以将输入数据传递给在后台运行的 WebSocketWorker 吗?

假设我有一个用于键入消息的 EditText 和一个用于发送消息的 Button,并附加了一个 setOnClickListener,如下所示:

binding.sendButton.setOnClickListener {
// get message
val message = binding.chatMessageEditText.text.toString()
// check if not empty
if(message.isNotEmpty()) {

// HOW CAN I REUSE THE WEBSOCKET RUNNING PERIODICALLY IN THE BACKGROUND?
// CAN I PASS THE MESSAGE TO THAT WEBSOCKET ?
// OR SHOULD I CREATE A DIFFERENT WORKER FOR SENDING MESSAGES (e.g.: a OneTimeRequest<SendMessageWorker> for sending messages ?

}
}

从文档中,我知道您需要构建数据对象来传递输入等,但没有示例展示如何将输入传递给在后台定期运行的工作人员。

最佳答案

我的经验告诉你可以。基本上你“不能”通过 API 与 worker 对象交互。这真的很烦人。

例如,使用 JS,您可以选择获取工作并检查工作参数。这项工作没有这样的选择。例如,我想检查限制的当前状态 - 满足什么,不满足什么。没有这样的。您可以检查状态、取消,这几乎就是全部。

我的建议是,这是因为 WorkManager 是 JS 等其他库的“门面/适配器”。它有自己的数据库来在设备重启时恢复 JS 作业和类似的东西,但除此之外,如果你想与内部交互,我想这对他们来说太复杂了,所以他们就跳过了。

您可以只注入(inject)一些其他对象,每次工作都可以要求它提供数据。我看不到其他选项。

关于Android WorkManager - 我可以将输入数据传递给定期运行的 Worker 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69076343/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com