在 android 上实施应用内购买

implementing in app purchase on android

我正在为我的应用程序在 eclipse 上实施购买,但我卡在了这部分,您必须调用 getSkuDetails

Bundle skuDetails = mService.getSkuDetails(3, getPackageName(), "inapp", querySkus);

android 实施指南 -> http://developer.android.com/google/play/billing/billing_integrate.html

告诉我

"Warning: Do not call the getSkuDetails method on the main thread. Calling this method triggers a network request which could block your main thread. Instead, create a separate thread and call the getSkuDetails method from inside that thread."

我唯一的问题是我不知道如何调用主线程中的另一个线程 activity 或如何去做,因为我以前从未做过,感谢任何可以帮助我的人过去一周

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    connection = new ServiceConnection() {

           @Override
           public void onServiceDisconnected(ComponentName name) {

               mService = null;

           }

           @Override
           public void onServiceConnected(ComponentName name, IBinder service) {

               mService = IInAppBillingService.Stub.asInterface(service);

           }
        };


        Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");

        serviceIntent.setPackage("com.android.vending");
        bindService(serviceIntent, connection, Context.BIND_AUTO_CREATE);


}

public void levelTwoButtonClicked(){

    Assets.click.play(1.00f);

    new LoadIconTask().execute();

}

class LoadIconTask extends AsyncTask<Integer, Integer, Long> {

    @Override
    protected Long doInBackground(Integer... params) {

        ArrayList<String> skuList = new ArrayList<String>();
        skuList.add(inappid);
        Bundle querySkus = new Bundle();
        querySkus.putStringArrayList("ITEM_ID_LIST", skuList);
        Bundle skuDetails;      

    try{

            skuDetails = mService.getSkuDetails(3, getPackageName(), "inapp", querySkus);

            int response = skuDetails.getInt("RESPONSE_CODE");
            if(response == 0){

                ArrayList<String> responseList = skuDetails.getStringArrayList("DETAILS_LIST");

                for(String thisResponse : responseList){

                    JSONObject object = new JSONObject(thisResponse);
                    String sku = object.getString("productID");
                    String price = object.getString("price");

                    if(sku.equals(inappid)){

                        System.out.println("price" + price);
                        Bundle buyIntentBundle = mService.getBuyIntent(3, getPackageName(), sku, "inapp", "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
                        PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT");
                        startIntentSenderForResult(pendingIntent.getIntentSender(), 1001, new Intent(), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0));

                    }

                }

            }
        } catch (RemoteException e){
            e.printStackTrace();
        } catch (JSONException e){
            e.printStackTrace();
        } catch (SendIntentException e){
            e.printStackTrace();
        }


        return null;
    }


}

每次我 运行 并单击我的二级购买按钮时,我都会收到此错误消息

06-07 20:16:26.102: E/AndroidRuntime(19783): FATAL EXCEPTION: AsyncTask #2
06-07 20:16:26.102: E/AndroidRuntime(19783): java.lang.RuntimeException: An error occured while executing doInBackground()
06-07 20:16:26.102: E/AndroidRuntime(19783):    at android.os.AsyncTask.done(AsyncTask.java:278)
06-07 20:16:26.102: E/AndroidRuntime(19783):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
06-07 20:16:26.102: E/AndroidRuntime(19783):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
06-07 20:16:26.102: E/AndroidRuntime(19783):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
06-07 20:16:26.102: E/AndroidRuntime(19783):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
06-07 20:16:26.102: E/AndroidRuntime(19783):    at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:208)
06-07 20:16:26.102: E/AndroidRuntime(19783):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
06-07 20:16:26.102: E/AndroidRuntime(19783):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
06-07 20:16:26.102: E/AndroidRuntime(19783):    at java.lang.Thread.run(Thread.java:856)
06-07 20:16:26.102: E/AndroidRuntime(19783): Caused by: java.lang.NullPointerException
06-07 20:16:26.102: E/AndroidRuntime(19783):    at com.izzymachado.framework.implementation.AndroidGame$LoadIconTask.doInBackground(AndroidGame.java:198)
06-07 20:16:26.102: E/AndroidRuntime(19783):    at com.izzymachado.framework.implementation.AndroidGame$LoadIconTask.doInBackground(AndroidGame.java:1)
06-07 20:16:26.102: E/AndroidRuntime(19783):    at android.os.AsyncTask.call(AsyncTask.java:264)
06-07 20:16:26.102: E/AndroidRuntime(19783):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

第 198 行是 skuDetails = mService.getSkuDetails(3, getPackageName(), "inapp", querySkus);

您不能在主线程上进行网络调用,这是因为您不想在发生这种情况时阻止用户执行操作。

因此,您应该为此操作使用 AsyncTask,它将在后台进行网络调用,然后通知您,以便您可以更改 UI(返回UI 线程)。