我正在尝试为高级会员设置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...
(在上面链接的文档中)
答案 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