Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

845
Views
La aplicación de Android Kotlin se bloquea debido a las corrutinas

Estoy desarrollando mi primera aplicación y aprendiendo sobre la marcha. La aplicación se comunica con una URL para obtener datos y, a veces, para enviar datos en un POST. Desde mi última actualización de Gradle a 7.1.1, mi aplicación se bloquea cuando abro 2 actividades diferentes en las que se produce dicha comunicación.

Aquí está el error que estoy recibiendo:

 E/AndroidRuntime: FATAL EXCEPTION: DefaultDispatcher-worker-1 Process: com.creoconcept.sifoa, PID: 7255 java.lang.IllegalStateException: No activity at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1366) at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2841) at androidx.fragment.app.FragmentManager.dispatchPause(FragmentManager.java:2802) at androidx.fragment.app.FragmentController.dispatchPause(FragmentController.java:295) at androidx.fragment.app.FragmentActivity.onPause(FragmentActivity.java:366) at com.creoconcept.sifoa.DisplayMyQrCode.onPause(DisplayMyQrCode.kt:63) at com.creoconcept.sifoa.DisplayMyQrCode$checkCodeScanned$1$run$1.invoke(DisplayMyQrCode.kt:37) at com.creoconcept.sifoa.DisplayMyQrCode$checkCodeScanned$1$run$1.invoke(DisplayMyQrCode.kt:26) at com.creoconcept.sifoa.Confs$communicateWithSifoaApi$1$1.invokeSuspend(Confs.kt:64) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)

I/Proceso: Envío de señal. PID: 7255 SIG: 9

Parece que tiene algo que ver con coroutines. Estoy acostumbrado a hacer el mismo tipo de cosas en jQuery, usando ajax o $.get(), y todavía no entiendo muy bien esto de las corrutinas. Solo estoy tratando de obtener algo de JSON de una URL, y parece ser algo mucho más complicado en Kotlin/Android que en jQuery.

Aquí hay algo de mi código:

 fun communicateWithSifoaApi(url:String, callback: (newRef: String) -> Unit){ CoroutineScope(Dispatchers.Default).launch { withContext(Dispatchers.IO) { callback(URL(api_url + url).readText()) } } }

Así es como estoy haciendo POST:

 fun sendPostToApi(url:String, dataString:String, callback: (response: String) -> Unit){ val mURL = URL(api_url + url) CoroutineScope(Dispatchers.Default).launch { withContext(Dispatchers.IO) { with(mURL.openConnection() as HttpURLConnection) { requestMethod = "POST" val wr = OutputStreamWriter(outputStream) wr.write(base64encoding.base64EncodeString(dataString)) wr.flush() BufferedReader(InputStreamReader(inputStream)).use { val response = StringBuffer() var inputLine = it.readLine() while (inputLine != null) { response.append(inputLine) inputLine = it.readLine() } callback(response.toString()) } } } } }

Solía tener GlobalScope.launch aquí, pero después de la actualización comencé a recibir el mensaje "API delicada", así que lo cambié a CoroutineScope(Dispatchers.Default).launch después de buscar en Google. Antes de eso, estaba usando doAsync, que parecía más similar a Ajax de jQuery, pero estaba obsoleto.

También hay un error ahora en FragmentManager.java, ahora que la actualización dice No se puede resolver el símbolo 'R' para androidx.fragment.R. No sé si esto tiene algo que ver con el problema.

Agradecería cualquier ayuda. Gracias.

fragmento xml:

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" xmlns:app="http://schemas.android.com/apk/res-auto" tools:context=".GoToShoppingCartButton"> <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/goToShoppingCartButton" android:layout_width="70sp" android:layout_height="70sp" android:layout_marginEnd="16dp" android:layout_marginBottom="16dp" android:backgroundTint="@color/buyButtonColor" android:clickable="true" android:contentDescription="@string/checkout" android:src="@drawable/cart" android:tint="@color/buyButtonTextColor" app:backgroundTint="@color/buyButtonColor" app:fabCustomSize="70sp" app:fabSize="auto" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" /> </FrameLayout>

Fragmento del archivo .kt:

 package com.creoconcept.sifoa import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import com.google.android.material.floatingactionbutton.FloatingActionButton class GoToShoppingCartButton : Fragment(R.layout.fragment_go_to_shopping_cart_button) { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_go_to_shopping_cart_button, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) view.findViewById<FloatingActionButton>(R.id.goToShoppingCartButton).setOnClickListener { activity?.let { val intent = Intent(it, ShoppingCart::class.java).apply {} it.startActivity(intent) } } } }

código en una actividad diferente, donde el fragmento se llama:

 private fun refreshGoToCartButton(){ val buttonFragment =supportFragmentManager.findFragmentByTag("goToCartButton") if(buttonFragment != null) { val ft = supportFragmentManager.beginTransaction() if (shoppingCartArray.isNotEmpty()) { ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out).show(buttonFragment).commit() } else { ft.hide(buttonFragment).commit() } } else if (shoppingCartArray.isNotEmpty()) { supportFragmentManager.commit { setReorderingAllowed(true) add<GoToShoppingCartButton>(R.id.browseImgsWrapper,"goToCartButton") } } }

Sin embargo, tenga en cuenta que el bloqueo ocurre incluso cuando ni siquiera abro la actividad donde se está utilizando este fragmento.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

ok por lo que parece estar arreglado ahora. Aparentemente no tuvo nada que ver con el FragmentManager (que el error No se puede resolver el símbolo 'R' para androidx.fragment.R parece ser un error de IDE y he optado por ignorarlo...)

una de las líneas en el informe de bloqueo es:

 at com.creoconcept.sifoa.DisplayMyQrCode.onPause(DisplayMyQrCode.kt:63)

Estaba llamando a la función onPause() en un ciclo que verificaba si el código QR se había escaneado cada 2 segundos. Cuando devuelve verdadero, se supone que la aplicación dice "Código escaneado" y luego regresa a la actividad principal. Eliminé la llamada onPause() y la reemplacé con mainHandler.removeCallbacksAndMessages(null) y ahora parece que ya no falla.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!