J'utilise le IabHelper
comme le recommande le tutoriel de Google, et je suis durement frappé par cette erreur. Apparemment, IabHelper
ne peut pas exécuter plusieurs opérations asynchrones en même temps. J'ai même réussi à le toucher en essayant de lancer un achat alors que l'inventaire était toujours en cours.
J'ai déjà essayé de mettre en œuvre onActivityResult
dans ma classe principale comme suggéré aquí mais je n'arrive même pas à appeler cette méthode avant que l'erreur ne survienne. Ensuite, j'ai trouvé este mais je n'ai aucune idée d'où trouver ça flagEndAsync
il n'est pas dans la méthode IabHelper
classe.
Je cherche maintenant un moyen de contourner ce problème (sans réimplémenter tout le système). La seule solution à laquelle je pense est de créer un champ booléen asyncActive
qui est vérifié avant qu'une tâche asynchrone ne soit lancée, et ne pas le faire s'il y a une autre tâche active. Mais cela pose de nombreux autres problèmes, et ne fonctionne pas pour toutes les activités. De plus, je préférerais qu'une tâche asynchrone soit mise en file d'attente et exécutée dès qu'elle est autorisée à le faire, plutôt que de ne pas s'exécuter du tout.
Des solutions pour ce problème ?
5 votes
Pour tous ceux qui lisent cette question, [b]faites défiler vers le bas[/b] et utilisez l'extrait 'onActivityResult()', c'est la réponse.
0 votes
Appelez mHelper.handleActivityResult() dans onActivityResult() pour que flagAsync() soit appelé. Voir l'exemple de code TrivialDrive de Google.
0 votes
Aucune de ces réponses n'est vraiment une solution propre. Je recommanderais d'utiliser un exécuteur à thread unique (Executor mExec = Executors.newSingleThreadExectuors()) et de construire une classe d'enveloppe qui fait de chaque appel IAB un runnable bloquant qui est mis en file d'attente de manière appropriée sur cet exécuteur.