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