Excepción: No se puede iniciar la operación asíncrona (actualizar el inventario) porque otra operación asíncrona (launchPurchaseFlow) está en curso

Sí, hay dos respuestas comunes a este problema:

Uno: Un hack donde se llama a billingHelper.flagEndAsync(); Antes de iniciar una operación asíncrona. Esto generalmente se considera como no recomendado, y no resuelve el problema en muchos casos.

Dos: Llamar el método handleActivityResult del handleActivityResult en handleActivityResult de la actividad. El problema con esta solución (además de no entender el propósito de este método) es que en mi aplicación las operaciones de facturación en la aplicación se realizan en la clase Application de la aplicación, porque hay un montón de actividades en la aplicación donde un usuario puede activar Una compra en la aplicación y múltiples posibles puntos de entrada donde la aplicación necesita consultar el inventario de compras en la aplicación. Así que traté de poner:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (!MyApplication.myAppInstance.mHelper.handleActivityResult(requestCode, resultCode, data)) super.onActivityResult(requestCode, resultCode, data); } 

En cada actividad donde un usuario podría iniciar una compra, pero esto no ha resuelto los accidentes. Realmente no entiendo el propósito de este material de OnActivityResult, así que probablemente no entendí cómo se supone que se implementará. ¿Por qué Google quiere forzarme a hacer operaciones de facturación en la aplicación de una actividad de todos modos?

Tuve un problema similar. Desafortunadamente el código IabHelper no es genial … es en su mayoría bueno, pero el modelo de subprocesos es un poco desordenado, lo que significa que puede llegar a ser confuso cómo manejar correctamente los casos de borde.

Una manera fácil de deshacerse de los accidentes es simplemente envolver la llamada al método con un cheque if-statement como:

 if (!mHelper.isAsyncInProgress()) { mHelper.launchPurchaseFlow(...); } 

Una mejor solución sería reescribir el código IabHelper desde cero … pero en este caso en particular la excepción ocurre tan rara vez que probablemente no vale la pena. Lamentablemente no hay una solución fácil en este caso … el código de ejemplo IabHelper no es el más grande y la mayoría de nosotros sólo decidirá vivir con él.

Tener una bandera para lanzarPurchaseFlow ignora varios lanzamientos de flujo de compra. Pero, por desgracia, esto falla si el usuario hace clic en el botón Atrás por error de Google In App Billing serviceIntent. Bandera debe restablecerse a false en este caso. De lo contrario, el usuario no podrá intentar comprar de nuevo.

 if(!mHelper.isAsyncInProgress()) { mHelper.launchPurchaseFlow(...); } // Invoke below method to reset onBackPressed public static void resetAsyncInProgress() { mHelper.setAsyncInProgress(false); } 
  • Verificación de la firma en el mensaje de compra en la aplicación de Android en Python en Google App Engine
  • Pagos en la aplicación para Android Amazon AppStore
  • Compra de Android en la aplicación
  • Prueba de compras en la aplicación de Android con aplicaciones no publicadas
  • Verificación de facturación de Android en la aplicación
  • Falta la opción "Añadir nuevo producto" en Google Play
  • Android Compra en la aplicación: cómo consumir?
  • Google Play prueba la facturación en la aplicación con la versión beta abierta
  • Formato de precio en la aplicación para Google Analytics
  • Ocurrió un error. Inténtalo de nuevo mientras esté en la prueba de facturación de la aplicación
  • IabResult: Error al actualizar el inventario (consultar elementos propios)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.