구글빌링 라이버리는 참 좋아서 예외 발생이 되면 사용자가 처리하도록 유도 하고 있습니다.
소스를 개니 던저주는게 아니죠..ㅠㅠ
flagStartAsync() ~ flagEndAsync() 가 한쌍으로 트랜젝션 처리가 되어 있는데
이 두개의 루틴사이에 에러가 발생되면 사용자가 알아서 락을 풀어줘야 합니다.
자 그러면 ..
셀프는 물만있는게 아니라는걸 한번더 상기시켜주는 구글서비스에 함 빠져봅시다.
launchPurchaseFlow() 호출시 두가지 예외가 발생합니다.
try {
billingHelper.launchPurchaseFlow(activity, itemName, REQUEST_CODE, purchaseFinishedListener);
} catch (NullPointerException e) {
Log.i("#@#", "Billing : NullPointerException " + e.getMessage());
} catch (IllegalStateException e) {
Log.i("#@#", "Billing : IllegalStateException " + e.getMessage());
}
1. NullPointerException 의 경우중 7:Item Already Owned 으로 에러가 발생되면
OnIabPurchaseFinishedListener 에서 예외처리를 해줘야 합니다.
결제가 성공되었으나 앱에는 적용이 안 될 수 있기 때문이죠..
2. launchPurchaseFlow() 사용시 NullPointerException , IllegalStateException 가 발생되면
flagStartAsync("launchPurchaseFlow") 에 의해서 락이 걸려 더이상 결제가 되지 않습니다.
빌링 모듈을 다시 실행해야 하는 상황이 발생되죠.. (앱을 껏다 켜야 하는 상황이 발생될 수 있음)
flagStartAsync("launchPurchaseFlow"); 가 되면 반듯이 flagEndAsync(); 가 되어야 하는데
정상적으로 handleActivityResult 를 통해서 데이터를 넘겨주어야 락이 풀립니다.
NullPointerException , IllegalStateException 에 의해서 handleActivityResult() 루틴까지 도달하지 못했으므로
flagStartAsync() 의 예외처리에 의해서 IllegalStateException 을 마구 던저줍니다.
따라서 빌링이 더이상 진행되지 않고 먹통이 되는 현상이 나타나게 되는거죠..
( 눈물이 날정도로 너무 좋은거 같아요..ㅠㅠ )
1. 2. 번의 상황이 순차적으로 이뤄지므로..
launchPurchaseFlow() 사용시 예외처리로 handleActivityResult()을 인위적으로 호출해야 하는 경우가
발생될 수 있으니 주의하세요~!!
무슨 말이냐믄... handleActivityResult(REQUEST_CODE , -1 , null) 요로코롬 인위적으로 사용해서
flagEndAsync();을 호출하라는거죠~
끗




좋은 정보 감사합니다.