如何在应用程序结算中解决Android ANR问题?

时间:2018-09-13 09:29:58

标签: android billing

自从我在应用上购买应用后,我在开发控制台中有了ANR:

"main" tid=1 Native 
"main" prio=5 tid=1 Native
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x72c68710 self=0x7116cc3a00
  | sysTid=23379 nice=-4 cgrp=default sched=0/0 handle=0x711b5859b0
  | state=S schedstat=( 915352226 193113724 1625 ) utm=57 stm=34 core=2 HZ=100
  | stack=0x7ff4300000-0x7ff4302000 stackSize=8MB
  | held mutexes=
  #00  pc 0000000000068fe4  /system/lib64/libc.so (__ioctl+4)
  #01  pc 0000000000024538  /system/lib64/libc.so (ioctl+132)
  #02  pc 0000000000061a10  /system/lib64/libbinder.so (_ZN7android14IPCThreadState14talkWithDriverEb+256)
  #03  pc 00000000000627a8  /system/lib64/libbinder.so (_ZN7android14IPCThreadState15waitForResponseEPNS_6ParcelEPi+340)
  #04  pc 00000000000624c8  /system/lib64/libbinder.so (_ZN7android14IPCThreadState8transactEijRKNS_6ParcelEPS1_j+216)
  #05  pc 0000000000056d98  /system/lib64/libbinder.so (_ZN7android8BpBinder8transactEjRKNS_6ParcelEPS1_j+72)
  #06  pc 000000000011fc74  /system/lib64/libandroid_runtime.so (???)
  #07  pc 000000000093ab84  /system/framework/arm64/boot-framework.oat (Java_android_os_BinderProxy_transactNative__ILandroid_os_Parcel_2Landroid_os_Parcel_2I+196)
  at android.os.BinderProxy.transactNative (Native method)
  at android.os.BinderProxy.transact (Binder.java:748)
  at com.android.vending.billing.IInAppBillingService$Stub$Proxy.getSkuDetails (IInAppBillingService.java:241)
  at com.kama_studio.fr.quatreimagesuneidee.GamePlay$33$1.run (GamePlay.java:3766)
  at android.app.Activity.runOnUiThread (Activity.java:6152)
  at com.kama_studio.fr.quatreimagesuneidee.GamePlay$33.onQueryInventoryFinished (GamePlay.java:3732)
  at com.kama_studio.fr.quatreimagesuneidee.util.IabHelper$2$1.run (IabHelper.java:631)
  at android.os.Handler.handleCallback (Handler.java:789)
  at android.os.Handler.dispatchMessage (Handler.java:98)
  at android.os.Looper.loop (Looper.java:251)
  at android.app.ActivityThread.main (ActivityThread.java:6572)
  at java.lang.reflect.Method.invoke (Native method)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:240)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:767)

代码如下:

IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {

public void onQueryInventoryFinished(final IabResult result, final Inventory inventory) {

    runOnUiThread(new Runnable() {
        public void run() {

            // Toast.makeText(getApplicationContext()," query inventory finished" , Toast.LENGTH_LONG).show();
            // Have we been disposed of in the meantime? If so, quit.
            if (mHelper == null) {


                BoutiqueActive = false;
                return;
            }

            // Is it a failure?
            if (result.isFailure()) {
                BoutiqueActive = false;

                //boutique non dispo
                //Toast.makeText(getApplicationContext(), " retrieving inventory failed" + result, Toast.LENGTH_LONG).show();
                // complain("Failed to query inventory: " + result);

            } else if (result.isSuccess()) {


                ArrayList<String> skuList = new ArrayList<String>();

                skuList.add(achat00);
                skuList.add(achat01);
                skuList.add(achat02);
                skuList.add(achat03);
                skuList.add(achat04);
                querySkus.putStringArrayList("ITEM_ID_LIST", skuList);
                try {
                    skuDetails = mService.getSkuDetails(3,
                            getPackageName(), "inapp", querySkus);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }

                int response = skuDetails.getInt("RESPONSE_CODE");

                if (response == 0) {
                    ArrayList<String> responseList
                            = skuDetails.getStringArrayList("DETAILS_LIST");

                    for (String thisResponse : responseList) {
                        JSONObject object = null;
                        try {
                            object = new JSONObject(thisResponse);
                            String sku = object.getString("productId");
                            String price = object.getString("price");
                            if (sku.equals("item00")) prix0 = price;
                            else if (sku.equals("item01")) prix1 = price;
                            else if (sku.equals("item02")) prix2 = price;
                            else if (sku.equals("item03")) prix3 = price;
                            else if (sku.equals("item04")) prix4 = price;

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

                    }
                    BoutiqueActive=true;
                    Noprice=false;
                }
                else if(response !=0)
                {

                    Noprice=true;

                }

                //Toast.makeText(getApplicationContext(),"query inventory successfull" , Toast.LENGTH_LONG).show();
                /*
                 * Check for items we own. Notice that for each purchase, we check
                 * the developer payload to see if it's correct! See
                 * verifyDeveloperPayload().
                 */

                // Do we have the premium upgrade?
                Purchase premiumPurchase = inventory.getPurchase(achat03);

                mIsPremium = (premiumPurchase != null && verifyDeveloperPayload(premiumPurchase));

                Boolean alreadyPreums = ReadJson.readBooleanFromFile(getApplicationContext(), false, "savegame.json", "Ads", 0, "Pub_Active");

                if (mIsPremium && alreadyPreums) {

                    ReturnCFG.pubActive = false;
                    SaveJson.changejson(getApplicationContext(), "savegame.json", "Ads", 0, "Pub_Active", false);
                    //so do something
                }
            }
        }
    });
}
};

导致ANR或错误的行是:

 try {
        skuDetails = mService.getSkuDetails(3,
                getPackageName(), "inapp", querySkus);
    } catch (RemoteException e) {
        e.printStackTrace();
    }

我不知道该怎么办,我什至不知道我是否可以做些什么... 我不认为我必须以异步方式编写此代码,因为它已经是异步方式了...所以我对如何处理一无所知

该错误再次以另一种形式出现:

"main" prio=5 tid=1 Native
  | group="main" sCount=1 dsCount=0 obj=0x7302d000 self=0xb5007800
  | sysTid=4948 nice=-4 cgrp=apps sched=0/0 handle=0xb6f53ec8
  | state=S schedstat=( 0 0 0 ) utm=20804 stm=5217 core=2 HZ=100
  | stack=0xbe6d9000-0xbe6db000 stackSize=8MB
  | held mutexes=
  #00  pc 000000000003b1c4  /system/lib/libc.so (__ioctl+8)
  #01  pc 0000000000051c61  /system/lib/libc.so (ioctl+14)
  #02  pc 00000000000204fb  /system/lib/libbinder.so (android::IPCThreadState::talkWithDriver(bool)+138)
  #03  pc 0000000000020b07  /system/lib/libbinder.so (android::IPCThreadState::waitForResponse(android::Parcel*, int*)+42)
  #04  pc 0000000000020ca9  /system/lib/libbinder.so (android::IPCThreadState::transact(int, unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+124)
  #05  pc 000000000001be8f  /system/lib/libbinder.so (android::BpBinder::transact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+30)
  #06  pc 0000000000086677  /system/lib/libandroid_runtime.so (???)
  #07  pc 0000000000aa2979  /data/dalvik-cache/arm/system@framework@boot.oat (Java_android_os_BinderProxy_transactNative__ILandroid_os_Parcel_2Landroid_os_Parcel_2I+144)
  at android.os.BinderProxy.transactNative (Native method)
  at android.os.BinderProxy.transact (Binder.java:519)
  at com.android.vending.billing.IInAppBillingService$Stub$Proxy.getSkuDetails (IInAppBillingService.java:241)
  at com.kama_studio.fr.quatreimagesuneidee.GamePlay$31.onQueryInventoryFinished (GamePlay.java:3763)
  at com.kama_studio.fr.quatreimagesuneidee.util.IabHelper$2$1.run (IabHelper.java:631)
  at android.os.Handler.handleCallback (Handler.java:739)
  at android.os.Handler.dispatchMessage (Handler.java:95)
  at android.os.Looper.loop (Looper.java:135)
  at android.app.ActivityThread.main (ActivityThread.java:5311)
  at java.lang.reflect.Method.invoke! (Native method)
  at java.lang.reflect.Method.invoke (Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:908)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:703)
更新: 日复一日仍然是同样的问题:

"main" prio=5 tid=1 Native
  | group="main" sCount=1 dsCount=0 obj=0x750f19d8 self=0xad484400
  | sysTid=30275 nice=-4 cgrp=default sched=0/0 handle=0xb0322534
  | state=S schedstat=( 0 0 0 ) utm=291 stm=97 core=3 HZ=100
  | stack=0xbe085000-0xbe087000 stackSize=8MB
  | held mutexes=
  #00  pc 0000000000048a98  /system/lib/libc.so (__ioctl+8)
  #01  pc 000000000001adf7  /system/lib/libc.so (ioctl+38)
  #02  pc 000000000003cc55  /system/lib/libbinder.so (_ZN7android14IPCThreadState14talkWithDriverEb+168)
  #03  pc 000000000003d62f  /system/lib/libbinder.so (_ZN7android14IPCThreadState15waitForResponseEPNS_6ParcelEPi+238)
  #04  pc 000000000003655d  /system/lib/libbinder.so (_ZN7android8BpBinder8transactEjRKNS_6ParcelEPS1_j+36)
  #05  pc 000000000009adcd  /system/lib/libandroid_runtime.so (???)
  #06  pc 0000000000622661  /system/framework/arm/boot-framework.oat (Java_android_os_BinderProxy_transactNative__ILandroid_os_Parcel_2Landroid_os_Parcel_2I+140)
  at android.os.BinderProxy.transactNative (Native method)
  at android.os.BinderProxy.transact (Binder.java:615)
  at com.android.vending.billing.IInAppBillingService$Stub$Proxy.getSkuDetails (IInAppBillingService.java:241)
  at com.kama_studio.fr.quatreimagesuneidee.GamePlay$31.onQueryInventoryFinished (GamePlay.java:3763)
  at com.kama_studio.fr.quatreimagesuneidee.util.IabHelper$2$1.run (IabHelper.java:631)
  at android.os.Handler.handleCallback (Handler.java:751)
  at android.os.Handler.dispatchMessage (Handler.java:95)
  at android.os.Looper.loop (Looper.java:154)
  at android.app.ActivityThread.main (ActivityThread.java:6311)
  at java.lang.reflect.Method.invoke! (Native method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:872)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:762)

0 个答案:

没有答案