首页 > 解决方案 > 如何在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 并订阅频道以从中获取消息。

标签: androidkotlinwebsocketandroid-workmanager

解决方案


推荐阅读