구글빌링 라이버리는 참 좋아서 예외 발생이 되면 사용자가 처리하도록 유도 하고 있습니다.

소스를 개니 던저주는게 아니죠..ㅠㅠ


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();을 호출하라는거죠~




끗