0

我想獲取用戶的購買,並且我聲稱我的Billing Service是空的,該進程在AsyncTask中運行,順便說一句,我是一個新手,以Inapp計費服務,這裏是部分我的代碼:getPurchases上的NullPointerException()

我的服務連接:

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); 
      } 
     }; 

我的AsyncTask的部分:

@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 
      } 

我現在用的是同樣的方式進行消費購買和獲取購買意圖和鄰其他功能,只有在這裏,現在它不工作!如果您需要更多信息或任何在這裏,請提前致謝!

編輯:

堆棧跟蹤:

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即可,而且您很安全。