android - 如何在android的后台定期监听websocket
问题描述
我在 android 中使用 stomp 客户端与服务器连接。我已经成功连接到服务器,并且在订阅时,当应用程序处于前台和后台时,我也会收到消息。杀死应用程序后我遇到问题。我没有收到消息。所以我已经尝试过工作管理器定期运行并订阅服务器。但我没有成功。请帮我解决这个问题。这是我的代码下面,请检查。
我正在使用工作管理器 2.6.0beta01
AndrodManifest.xml
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<!-- If you are using androidx.startup to initialize other components -->
<meta-data
android:name="androidx.work.impl.WorkManagerInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>
上面我已经初始化它的清单代码。
应用程序.kt
class App : Application() {
val compositeDisposable = CompositeDisposable()
override fun onCreate() {
super.onCreate()
mStompClient = Stomp.over(
Stomp.ConnectionProvider.OKHTTP,
AppConstant.Base_Url_socket
)
mStompClient?.connect()
mStompClient?.lifecycle()
?.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe { lifecycleEvent: LifecycleEvent ->
when (lifecycleEvent.type) {
LifecycleEvent.Type.OPENED -> {
startWorkManager()
Log.e("WebSocket", "Stomp connection opened")
}
LifecycleEvent.Type.ERROR -> {
Log.e("error", lifecycleEvent.exception.message.toString())
Log.e("WebSocket", "Stomp connection error")
}
LifecycleEvent.Type.CLOSED -> Log.e("WebSocket", "Stomp connection closed")
}
}?.autoDispose(compositeDisposable)
}
companion object {
var mStompClient: StompClient? = null
fun startWorkManager(){
val constraints: Constraints = Constraints.Builder().apply {
setRequiredNetworkType(NetworkType.CONNECTED)
}.build()
val periodicWorkRequest= PeriodicWorkRequest.Builder(
MyJobService::class.java,
PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS,
TimeUnit.MINUTES
)
.setConstraints(constraints)
.addTag(AppConstant.subscribeTag)
.build()
WorkManager.getInstance(applicationContext()).enqueueUniquePeriodicWork(AppConstant.nameTag,
ExistingPeriodicWorkPolicy.KEEP,periodicWorkRequest)
}
}
}
在上面的代码中,我已经连接了 websocket 并启动了定期工作者。
MyJobService.kt
class MyJobService(var context: Context, var workerParameters: WorkerParameters) :
Worker(context, workerParameters) {
val compositeDisposable = CompositeDisposable()
lateinit var notificationUtils: NotificationNetworkUtils
override fun doWork(): Result {
return try {
// Do something
App.mStompClient = Stomp.over(
Stomp.ConnectionProvider.OKHTTP,
AppConstant.Base_Url_socket
)
App.mStompClient?.connect()
notificationUtils = NotificationNetworkUtils(context)
var response = ""
val userId = PreferenceHelper.get<LoginDetail>(AppConstant.PREF_LOGIN)?.id
if (userId != null) {
App.mStompClient?.topic("/topic/sendMessageResult/$userId")
?.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe { topicMessage: StompMessage ->
Toast.makeText(applicationContext, topicMessage.payload, Toast.LENGTH_SHORT)
.show()
Log.e("hasu", topicMessage.payload)
response = topicMessage.payload
notificationUtils.startForegroundNotification(response)
}
}
// val inputData = Data.Builder()
// .putString("response", response)
// .build()
Result.success()
} catch (error: Throwable) {
Log.e("workrequest==>", error.message!!)
Result.failure()
Result.retry()
}
}
}
上面的代码是工人阶级的。我在哪里听 websocket 并订阅频道以从中获取消息。