0

사용자의 구매를 시도하고 있는데 내 청구 서비스가 null이고 프로세스가 AsyncTask에서 실행 중이고 btw Inapp 결제 서비스의 초보자 인 경우 여기에 내 코드 :getPurchases()의 NullPointerException

내 서비스 연결 : 내 AsyncTask를의

IInAppBillingService BillingService; 

private ServiceConnection ServiceConnection = new ServiceConnection() { 

      @Override 
      public void onServiceDisconnected(ComponentName name) { 

       BillingService = null ; 
      } 

      @Override 
      public void onServiceConnected(ComponentName name, IBinder service) { 

       BillingService = IInAppBillingService.Stub.asInterface(service); 
      } 
     }; 

부 :

@Override 
     protected String doInBackground(Activity... params) { 
      final Activity mActivity = params[0]; 

      bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"), ServiceConnection, Context.BIND_AUTO_CREATE); 


ConnectivityManager c = (ConnectivityManager) getSystemService(Service.CONNECTIVITY_SERVICE); 
      NetworkInfo NI = c.getActiveNetworkInfo(); 

      if(NI == null || ! NI.isConnected()){ 

        // do some stuff 

      }else{ 
       Bundle purchases = null; 

       try {     


        purchases = 
          BillingService. 
          getPurchases(3, "le.wild.packagename", "inapp", null); 
       } catch (RemoteException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       if(purchases.getInt("RESPONSE_CODE") == 0){ 
        ArrayList<String> Items = purchases.getStringArrayList("INAPP_PURCHASE_ITEM_LIST"); 
        ArrayList<String> itemsData = purchases.getStringArrayList("INAPP_PURCHASE_DATA_LIST"); 

        boolean o = false; 

        for(int i = 0 ; itemsData.size() > i ; i++){ 
         if(Items.get(i).contains("le.wild.itemName")){ 
          o = false; 
          continue; 
         }else{ 
          o = true; 
         } 
        } 
        // do some stuff 
      } 
내가 구매 의도와 O를 구매를 소모하고 얻기를 위해 같은 방법을 사용하고 있습니다

ther 기능, 여기와 지금은 작동하지 않습니다! 더 이상 정보가 필요하거나 아무것도 없으면 미리 감사드립니다!

편집 :

스택 트레이스 :

07-22 15:58:12.830: E/AndroidRuntime(12719): FATAL EXCEPTION: AsyncTask #1 
07-22 15:58:12.830: E/AndroidRuntime(12719): java.lang.RuntimeException: An error occured while executing doInBackground() 
07-22 15:58:12.830: E/AndroidRuntime(12719): at android.os.AsyncTask$3.done(AsyncTask.java:299) 
07-22 15:58:12.830: E/AndroidRuntime(12719): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
07-22 15:58:12.830: E/AndroidRuntime(12719): at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
07-22 15:58:12.830: E/AndroidRuntime(12719): at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
07-22 15:58:12.830: E/AndroidRuntime(12719): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
07-22 15:58:12.830: E/AndroidRuntime(12719): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
07-22 15:58:12.830: E/AndroidRuntime(12719): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
07-22 15:58:12.830: E/AndroidRuntime(12719): at java.lang.Thread.run(Thread.java:856) 
07-22 15:58:12.830: E/AndroidRuntime(12719): Caused by: java.lang.NullPointerException 
07-22 15:58:12.830: E/AndroidRuntime(12719): at seaskyways.quadcoremanagerplus.CoresManagement$2.doInBackground(CoresManagement.java:372) 
07-22 15:58:12.830: E/AndroidRuntime(12719): at seaskyways.quadcoremanagerplus.CoresManagement$2.doInBackground(CoresManagement.java:1) 
07-22 15:58:12.830: E/AndroidRuntime(12719): at android.os.AsyncTask$2.call(AsyncTask.java:287) 
07-22 15:58:12.830: E/AndroidRuntime(12719): at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
07-22 15:58:12.830: E/AndroidRuntime(12719): ... 4 more 
+0

StackTrace주세요. – FabianCook

+0

'onServiceDisconnected()'에'BillingService == null'을 설정했습니다. 예외가 발생할 때가 될 수 있습니다. 'if (BillingService! =) {purchases = BillingService ..........; }'. – Vikram

+0

stacktrace를 추가했습니다. – Seaskyways

답변

1

bindService는 비동기입니다. onServiceConnected를 호출하기 전에 인터페이스를 설정하기까지 약간의 시간이 걸립니다. 따라서 실제로 전화를 걸기 전에 훨씬 더 일찍 서비스에 바인딩해야합니다.

대문자로 시작하는 변수의 이름을 혼동하는 것은 혼란 스럽습니다.

+0

기다림 (5000)이 충분합니까? – Seaskyways

+0

비동기 작업을 수행하고 있기 때문에. 네, 단순히 연결을 기다리는 옵션이 있습니다. 내가 얼마나 오래 오래되는지 말할 수 없다. 바인더를 돌려주는 데 얼마나 오래 걸리는지에 달려있다. 이상적으로는 활동의 라이프 사이클의 일부로 수행해야합니다 (bind onCreate, onDestroy에서 바인딩 해제). – roostertech

0

onServiceConnected에만 getPurchases으로 전화하면 안전합니다.