es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo acceder a un diálogo desde la clase de trabajador de WorkManager

Tengo un diálogo en la actividad y necesito acceder al diálogo desde la clase de trabajador de WorkManager para mostrar el diálogo.

El código del diálogo está en la actividad:

companion object {

        fun showDialog(
            context: Context,
            title: String,
            timeStamp: String,
        ) {
            val dialog = Dialog(context)
            dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
            dialog.setCancelable(false)
            dialog.setContentView(R.layout.alert_layout)
            val closeImage = dialog.findViewById(R.id.iv_close) as ImageView
            val tvTimeStamp = dialog.findViewById(R.id.tv_timeStamp) as TextView
            val llAlertMain = dialog.findViewById(R.id.ll_alert_main) as LinearLayout
            tvTimeStamp.text = timeStamp

            closeImage.setOnClickListener {
                dialogIsShowing = false
                dialog.dismiss()
            }
            dialog.show()
            dialogIsShowing = true
        }

    }

El código de la clase de trabajador:

override fun doWork(): Result {

        try {
            CoroutineScope(Dispatchers.IO).launch{
                showDialog()
            }
            return Result.success()

        }catch (e : Exception){
            return Result.failure()
        }

    }

private showDialog(){
        try {
            MainActivity.showDialog(applicationContext, title, timeStamp)
            //CustomDialogFragment.newInstance("Title", "SubTitle").show(supportFragmentManager, CustomNotificationDialogFragment.TAG)
        }catch (e: Exception){
            e.printStackTrace()
        }
    }

Pero está dando error: Unable to add window — token null is not valid; is your activity running?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar relacionado con el contexto utilizado para mostrar el diálogo. Dado que la clase de trabajador no está adjunta al contexto de la actividad, no puede acceder al diálogo. Una forma de resolver esto sería pasar la instancia de la actividad a la clase de trabajador y usarla para mostrar el diálogo.

    Primero, modifica la clase de trabajador para aceptar la instancia de la actividad:

    class MyWorker(val context: Context, params: WorkerParameters) : Worker(context, params) {
    
        override fun doWork(): Result {
            try {
                CoroutineScope(Dispatchers.IO).launch {
                    showDialog(context)
                }
                return Result.success()
            } catch (e: Exception) {
                return Result.failure()
            }
        }
    
        private fun showDialog(activityContext: Context) {
            try {
                MainActivity.showDialog(activityContext, title, timeStamp)
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }
    

    Luego, al crear la solicitud de trabajo en la actividad, pasa la instancia de la actividad al trabajador:

    val workRequest = OneTimeWorkRequest.Builder(MyWorker::class.java)
        .setInputData(workDataOf("title" to "Título del diálogo", "timeStamp" to "123"))
        .build()
    WorkManager.getInstance(this).enqueue(workRequest)
    

    Ahora, la clase de trabajador puede usar el contexto de la actividad para mostrar el diálogo. Ten en cuenta que este enfoque no se recomienda, ya que acopla estrechamente la clase de trabajador con la actividad, que puede no estar siempre disponible. Un enfoque mejor sería utilizar una transmisión o una transmisión local para notificar a la actividad que muestre el diálogo.

Comments are closed.