2013-09-30 3 views
0

저는 비동기 작업을 사용하여 단기간의 백그라운드 계산 작업을 수행하는 앱을 사용하고 있습니다. 이것들은 OK (onPostExecute() 등을 거침)를 끝내는 것처럼 보이지만, Eclipse 디버거에서는 하나 이상이 여전히 멈 춥니 다.AsyncTask 스레드가 끝나지 않습니다

그런 다음이 링크 - AsyncTask threads never die을 찾았습니다. - 좋아, 스레드 풀에 관한 것이고 이론상 문제는 아닙니다.

그러나 문제는 Google 인앱 결제 코드 V3을 사용하려고하는데 구매를 수행하고 이미 AsyncTask 스레드가 걸려있는 경우 예외가 발생하는 것 같습니다. 예외를 잡는 것은 도움이되지 않습니다 - 그것은 여전히 ​​아무것도하지 않을 것입니다.

어떻게이 문제를 해결할 수 있습니까? 이전 계산 스레드를 보장하려면 무엇을해야합니까?

+0

"구매를 수행 할 때마다 예외가 발생하는 것으로 보입니다. 이미 AsyncTask 스레드가 있습니다."- 대신이 질문에 대한 정보를 제공하고 왜 이것이 필요한지 묻는 질문에 집중할 것입니다. 발생합니다. IOW, 당신은 분홍색 코끼리가 존재한다는 어떠한 증거도없이 당신의 분홍색 코끼리 침략을 제거하는 방법을 요구하고 있습니다. 'AsyncTask' 스레드 풀 동작이 4 년 동안 진행 되었기 때문에 인수로 인앱 결제가 거의 응용 프로그램에서 작동하지 않을 것으로 보입니다. – CommonsWare

답변

1

여기에서 무슨 일이 일어나고 있는지, 나는 그것이 생각한 바가 아니었다. 누군가에게 유용 할 수 있으므로 여기에서 자세히 설명하겠습니다. 다른 AsyncTask 스레드 및 스레드 풀링과 관련이 없습니다.

IabHelper 클래스에는 flagStartAsync()와 flagEndAsync()의 두 가지 함수가 있습니다. 이러한 목적은 기존의 멀티 스레딩에서 wait() 및 signal()과 같은 비트)를 생성하여 한 번에 하나의 비동기 작업 (Google Play 및 서버와의 통신) 만 발생할 수 있도록하는 것입니다. flagStartAsync()가 이미 진행되는 동안 호출되면 예외가 발생합니다. 대단히 우아하지는 않지만 효과적인 것 같아요.

flagStartAsync() 'test and set'은 다른 곳에서 launchPurchaseFlow()가 시작될 때 호출되고 handleEctivityResult()에서는 flagEndAsync가 호출됩니다. 따라서 구매 흐름을 제공하면 항상 결과가 나오고 문제는 발생하지 않습니다. 문제는 - 항상 그런 것은 아닙니다.

launchPurchaseFlow()를 보면 비동기 작업을 시작하지 않는 몇 가지 경로가 있으며, 그 중 하나가 수행되면 mAsyncInProgress (관련 플래그)가 왼쪽으로 설정됩니다.

필자의 경우에는 제품을 이미 구매했는지 확인하지 않았으며 '이미 구입했다'는 경로 중 하나입니다. Mea culpa,하지만 문제는 내가 때때로 피할 수없는 몇 가지 다른 경로가 없다는 것을 스스로 확신 할 수 없다는 것입니다. 작업이 느리고 '구매'버튼이 두 번 눌려지면 어떻게할까요? 나는 다른 사람들도 있다고 생각한다. 하나는 예외를 잡을 수 있고 그것은 충돌을 멈추지 만 끝나면 깃발을 지우는 데 아무 일도 없었다면 정말 도움이되지 않습니다. 예외 처리기가 flagEndAsync()를 호출 할 수 있다고 생각하지만 너트 느낌을 해소하는 불편 함이 있습니다.

이것은 아마도 강력하지 않은 코드 일 것입니다. 지금까지 내가 한 것은 launchPurchaseFlow()에서 다양한 방법으로 flagEndAsync()를 호출하는 것입니다.하지만 이것은 단지 임시 수정 사항입니다. 필자는 IabHelper 코드에 대해 충분히 알지 못합니다. 그러나 더 신중한 생각이 필요하다고 생각하며, 모든 것을보기 위해 분석해야합니다.

관련 문제