여기에서 무슨 일이 일어나고 있는지, 나는 그것이 생각한 바가 아니었다. 누군가에게 유용 할 수 있으므로 여기에서 자세히 설명하겠습니다. 다른 AsyncTask 스레드 및 스레드 풀링과 관련이 없습니다.
IabHelper 클래스에는 flagStartAsync()와 flagEndAsync()의 두 가지 함수가 있습니다. 이러한 목적은 기존의 멀티 스레딩에서 wait() 및 signal()과 같은 비트)를 생성하여 한 번에 하나의 비동기 작업 (Google Play 및 서버와의 통신) 만 발생할 수 있도록하는 것입니다. flagStartAsync()가 이미 진행되는 동안 호출되면 예외가 발생합니다. 대단히 우아하지는 않지만 효과적인 것 같아요.
flagStartAsync() 'test and set'은 다른 곳에서 launchPurchaseFlow()가 시작될 때 호출되고 handleEctivityResult()에서는 flagEndAsync가 호출됩니다. 따라서 구매 흐름을 제공하면 항상 결과가 나오고 문제는 발생하지 않습니다. 문제는 - 항상 그런 것은 아닙니다.
launchPurchaseFlow()를 보면 비동기 작업을 시작하지 않는 몇 가지 경로가 있으며, 그 중 하나가 수행되면 mAsyncInProgress (관련 플래그)가 왼쪽으로 설정됩니다.
필자의 경우에는 제품을 이미 구매했는지 확인하지 않았으며 '이미 구입했다'는 경로 중 하나입니다. Mea culpa,하지만 문제는 내가 때때로 피할 수없는 몇 가지 다른 경로가 없다는 것을 스스로 확신 할 수 없다는 것입니다. 작업이 느리고 '구매'버튼이 두 번 눌려지면 어떻게할까요? 나는 다른 사람들도 있다고 생각한다. 하나는 예외를 잡을 수 있고 그것은 충돌을 멈추지 만 끝나면 깃발을 지우는 데 아무 일도 없었다면 정말 도움이되지 않습니다. 예외 처리기가 flagEndAsync()를 호출 할 수 있다고 생각하지만 너트 느낌을 해소하는 불편 함이 있습니다.
이것은 아마도 강력하지 않은 코드 일 것입니다. 지금까지 내가 한 것은 launchPurchaseFlow()에서 다양한 방법으로 flagEndAsync()를 호출하는 것입니다.하지만 이것은 단지 임시 수정 사항입니다. 필자는 IabHelper 코드에 대해 충분히 알지 못합니다. 그러나 더 신중한 생각이 필요하다고 생각하며, 모든 것을보기 위해 분석해야합니다.
"구매를 수행 할 때마다 예외가 발생하는 것으로 보입니다. 이미 AsyncTask 스레드가 있습니다."- 대신이 질문에 대한 정보를 제공하고 왜 이것이 필요한지 묻는 질문에 집중할 것입니다. 발생합니다. IOW, 당신은 분홍색 코끼리가 존재한다는 어떠한 증거도없이 당신의 분홍색 코끼리 침략을 제거하는 방법을 요구하고 있습니다. 'AsyncTask' 스레드 풀 동작이 4 년 동안 진행 되었기 때문에 인수로 인앱 결제가 거의 응용 프로그램에서 작동하지 않을 것으로 보입니다. – CommonsWare