设置Android iAP购买 - 错误

时间:2016-09-08 16:06:39

标签: java android multithreading in-app-purchase

我正在尝试为高级会员设置iAP。 我已将我的应用程序和我签名的apk添加到开发人员控制台,然后我开始关注此示例:Implementing In-app Billing

我注意到一个棘手的部分:

  

警告:不要在主线程上调用getSkuDetails方法。调用此方法会触发可能阻止主线程的网络请求。相反,创建一个单独的线程并从该线程内部调用getSkuDetails方法。

所以这是我写的代码:

public class class...
Bundle querySkus = new Bundle();


/** gestisce gli acquisti in app */
IInAppBillingService mService;

ServiceConnection mServiceConn = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        mService = IInAppBillingService.Stub.asInterface(service);
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        mService = null;
    }
    };

并在我的onCreate()方法中:

Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
    serviceIntent.setPackage("com.android.vending");
    bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);

    ArrayList<String> skuList = new ArrayList<String>();
    skuList.add("premiumUpgrade");


    querySkus.putStringArrayList("chords_premium", skuList);

    AsyncTask.execute(new Runnable() {
        @Override
        public void run() {
            Bundle skuDetails = mService.getSkuDetails(3, getPackageName(), "inapp", querySkus);
        }
    });

现在Bundle skuDetails = mService.getSkuDetails(3, getPackageName(), "inapp", querySkus);我得到了:

  

未处理的异常:android.os.RemoteException

首先,如何解决?

我正在我的主要活动中实现此代码,即使应该重定向到购买对话框的按钮是另一个活动。 我做得对吗?我需要将其传递给其他活动吗?如果是这样,怎么样?我把处理iAP的整个代码放在特定活动中是否更好?

**编辑:** 我试图抓住这样的例外:

AsyncTask.execute(new Runnable() {
        @Override
        public void run() {
            try {Bundle skuDetails = mService.getSkuDetails(3, getPackageName(), "inapp", querySkus); }
            catch (RemoteException e) {e.printStackTrace();};
        }
    });

这是行不通的,因为我无法设置int response = skuDetails...(在上面链接的文档中)

1 个答案:

答案 0 :(得分:0)

没有测试过你的代码..但我认为你可以试试这个:

    AsyncTask.execute(new Runnable() {
                @Override
                public void run() {
                    Bundle skuDetails = null;
                    try {
                        skuDetails = mService.getSkuDetails(3,
                           getPackageName(), "inapp", querySkus); 
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                    int response = skuDetails.whateverYouWantToDoWithThis();
                }
     });

OR

AsyncTask.execute(new Runnable() {
                @Override
                public void run() throws RemoteException {
                    Bundle skuDetails = mService.getSkuDetails(3,
                           getPackageName(), "inapp", querySkus); 
                    int response = skuDetails.whateverYouWantToDoWithThis();
                }
     });

在此处阅读有关throws vs try-catch的更多信息:try/catch versus throws Exception