Android - необученный NPE с базовым приложением для биллинга
Я пытаюсь получить skus, как говорят в Android документах:
IInAppBillingService mService;
ServiceConnection mServiceConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
mService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = IInAppBillingService.Stub.asInterface(service);
}
};
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"),mServiceConn, Context.BIND_AUTO_CREATE);
ArrayList<String> skuList = new ArrayList<String>();
skuList.add("no_ads");
Bundle querySkus = new Bundle();
querySkus.putStringArrayList("ITEM_ID_LIST", skuList);
Bundle skuDetails = new Bundle();
try {
skuDetails = mService.getSkuDetails(3, getPackageName(), "inapp", querySkus);
} catch (RemoteException e) {
e.printStackTrace();
}
}
LogCat:
07-28 19:48:33.243: E/AndroidRuntime(24103): FATAL EXCEPTION: main
07-28 19:48:33.243: E/AndroidRuntime(24103): Process: com.example, PID: 24103
07-28 19:48:33.243: E/AndroidRuntime(24103): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.AndroidLauncher}: java.lang.NullPointerException
07-28 19:48:33.243: E/AndroidRuntime(24103): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
07-28 19:48:33.243: E/AndroidRuntime(24103): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
07-28 19:48:33.243: E/AndroidRuntime(24103): at android.app.ActivityThread.access$800(ActivityThread.java:135)
07-28 19:48:33.243: E/AndroidRuntime(24103): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
07-28 19:48:33.243: E/AndroidRuntime(24103): at android.os.Handler.dispatchMessage(Handler.java:102)
07-28 19:48:33.243: E/AndroidRuntime(24103): at android.os.Looper.loop(Looper.java:136)
07-28 19:48:33.243: E/AndroidRuntime(24103): at android.app.ActivityThread.main(ActivityThread.java:5017)
07-28 19:48:33.243: E/AndroidRuntime(24103): at java.lang.reflect.Method.invokeNative(Native Method)
07-28 19:48:33.243: E/AndroidRuntime(24103): at java.lang.reflect.Method.invoke(Method.java:515)
07-28 19:48:33.243: E/AndroidRuntime(24103): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
07-28 19:48:33.243: E/AndroidRuntime(24103): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
07-28 19:48:33.243: E/AndroidRuntime(24103): at dalvik.system.NativeStart.main(Native Method)
07-28 19:48:33.243: E/AndroidRuntime(24103): Caused by: java.lang.NullPointerException
07-28 19:48:33.243: E/AndroidRuntime(24103): at com.example.AndroidLauncher.onCreate(AndroidLauncher.java:138)
07-28 19:48:33.243: E/AndroidRuntime(24103): at android.app.Activity.performCreate(Activity.java:5231)
07-28 19:48:33.243: E/AndroidRuntime(24103): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
07-28 19:48:33.243: E/AndroidRuntime(24103): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
Итак, проблема в том, что линия skuDetails = mService.getSkuDetails(3, getPackageName(), "inapp", querySkus);
вызывает исключение нулевого указателя (Eclipse заставил меня поместить его в try/catch, но он все равно не перехватился) и не может понять почему. Это должно быть тривиально для реализации, но каким-то образом мне не удается выполнить самые базовые настройки.
РЕДАКТИРОВАТЬ: ОК, я понял - mService был нулевым, потому что он еще не был подключен. Как мне ждать, пока onServiceConnected
вызывается до того, как я попытаюсь что-то сделать с биллингом в приложении? Конечно, есть какой-то стандартный способ сделать это - очевидно, что само собой разумеется, потому что Google не упомянул об этом в своих документах.
1 ответ
Ты пытаешься казнить
skuDetails = mService.getSkuDetails(3, getPackageName(), "inapp", querySkus);
в onCreate - но mService может еще не быть (асинхронный) - вы можете сделать это после вызова onServiceConnected