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

Другие вопросы по тегам