Android: отмена платежного намерения во время ожидания подключения к сети

Я пытаюсь добавить ProgressDialog в свою активность, чтобы показать, когда загружается запрос на выставление счетов - поскольку это сетевой запрос, иногда это занимает некоторое время. Я показываю диалоговое окно прогресса, а затем закрываю его, когда сетевой запрос завершен. Однако иногда это занимает ОЧЕНЬ много времени и, кажется, зависает. Если я хочу, чтобы пользователь мог отменить запрос и закрыть диалоговое окно выполнения, как мне добавить эту возможность? Или есть лучший способ справиться с задержкой сетевого запроса?

Вот мой код покупки:

private void MakePurchase(final String s)
{
    if (makingPayment) return;
    makingPayment = true;

    mProgressDialog = new ProgressDialog(DonateActivity.this);
    mProgressDialog.setTitle("Google Play Store");
    mProgressDialog.setMessage("Loading...");
    mProgressDialog.setIndeterminate(false);
    mProgressDialog.setCancelable(false);
    mProgressDialog.setCanceledOnTouchOutside(false);
    mProgressDialog.show();

    new Thread(new Runnable() {
        public void run() {
            ArrayList<String> skuList = new ArrayList<String> ();
            skuList.add(s);
            Bundle querySkus = new Bundle();
            querySkus.putStringArrayList("ITEM_ID_LIST", skuList);
            Bundle skuDetails;
            try {
                //Network request
                skuDetails = mService.getSkuDetails(3,
                        getPackageName(), "inapp", querySkus);
                mProgressDialog.dismiss();

                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");
                        if (sku.equals(s)) {
                            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 (IntentSender.SendIntentException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();
}

person Adam    schedule 24.03.2014    source источник


Ответы (1)


person Chris Arriola    schedule 24.03.2014
comment
Да, но как отменить вызов mService.getSkuDetails()? - person Adam; 25.03.2014
comment
Какую базовую сетевую библиотеку вы используете для выполнения mService.getSkuDetails()? Апач HTTP? Есть несколько способов сделать это, mService.getSkuDetails() может вернуть какой-то объект сетевого запроса, который имеет метод отмены. Прямо сейчас у вас нет ссылки на ожидающий запрос, поэтому нет возможности отменить ожидающий запрос, пока вы не предоставите какой-то механизм отмены. - person Chris Arriola; 25.03.2014
comment
Я просто использую библиотеку IInAppBillingService. Я очень новичок в сети, и я не уверен, как я буду раскрывать сущность. Можете ли вы предоставить пример кода? - person Adam; 25.03.2014
comment
Адам, ты когда-нибудь понял это? Я сейчас в той же лодке. - person randallmeadows; 19.06.2015