В последней версии моего приложения много проблем с ANR в консоли Google Play. Тем не менее, я понятия не имею, как его обнаружить, потому что в отличие от cra sh - нет никакой конкретной информации, которая вызывает эту ошибку. Я также не могу воспроизвести это. Я пытался установить StrictMode, но нет информации. Вот лог из Google Play:
Input dispatching timed out (Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago. Wait queue length: 15. Wait queue head age: 6275.4ms.)
com.app.activities.MainActivity
"main" prio=5 tid=1 Native
| group="main" sCount=1 dsCount=0 flags=1 obj=0x75575af0 self=0x7d33a14c00
| sysTid=32404 nice=-10 cgrp=default sched=0/0 handle=0x7db97df548
| state=S schedstat=( 856817053 66517026 2057 ) utm=59 stm=26 core=6 HZ=100
| stack=0x7ff86f1000-0x7ff86f3000 stackSize=8MB
| held mutexes=
#00 pc 000000000007cab0 /system/lib64/libc.so (__ioctl+4)
#01 pc 000000000002c8f0 /system/lib64/libc.so (ioctl+132)
#02 pc 000000000005cd88 /system/lib64/libbinder.so (android::IPCThreadState::talkWithDriver(bool)+244)
#03 pc 000000000005db34 /system/lib64/libbinder.so (android::IPCThreadState::waitForResponse(android::Parcel*, int*)+60)
#04 pc 000000000005d988 /system/lib64/libbinder.so (android::IPCThreadState::transact(int, unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+176)
#05 pc 00000000000519a0 /system/lib64/libbinder.so (android::BpBinder::transact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+72)
#06 pc 0000000000136c34 /system/lib64/libandroid_runtime.so (android_os_BinderProxy_transact(_JNIEnv*, _jobject*, int, _jobject*, _jobject*, int)+152)
at android.os.BinderProxy.transactNative (BinderProxy.java)
at android.os.BinderProxy.transact (BinderProxy.java:1129)
at com.android.vending.billing.IInAppBillingService$Stub$Proxy.isBillingSupported (IInAppBillingService.java:202)
at com.mill.coders.purchases.payments.IabHelper$1.onServiceConnected (IabHelper.java:244)
at android.app.LoadedApk$ServiceDispatcher.doConnected (LoadedApk.java:1741)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run (LoadedApk.java:1773)
at android.os.Handler.handleCallback (Handler.java:873)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loop (Looper.java:280)
at android.app.ActivityThread.main (ActivityThread.java:6706)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:858)
Как видите, если я не ошибаюсь, подозрительно относится к классу IabHelper. Это очень странно, потому что это метод asyn c. Кроме того - в верхней части экрана вы можете видеть, что журнал поступает из Main Activity (верно?). IabHelper не существует в MainActivity, поэтому WTF? Как я могу проверить это? : / Вот как я использую метод setUp из IabHelper в другой деятельности:
private fun goToOfferScreen() {
offerScreenShown = true
getItemPrice(item)
animateView(whole_card, Techniques.SlideOutDown, 200)
animateView(starImageView, Techniques.SlideOutDown, 200)
ribbons.visibility = View.GONE
levelUpTitle.visibility = View.GONE
levelUpValue.visibility = View.GONE
newLimitLabel.visibility = View.GONE
newLimitValue.visibility = View.GONE
coinBonusTitle.visibility = View.GONE
coinBonusValue.visibility = View.GONE
cashDiff.visibility = View.GONE
delayAction({ showOfferScreen(item) }, 300)
delayAction({ showButtonsWithDelay() }, 800)
}
private fun getItemPrice(bankOfferItem: LevelUpOfferModel) {
if (AppPreferences.isSamsungBuild) {
val iapHelper = IapHelper.getInstance(context)
iapHelper.setOperationMode(HelperDefine.OperationMode.OPERATION_MODE_TEST)
iapHelper.getProductsDetails(bankOfferItem.bundle.name) { errorVo, arrayList ->
errorVo?.let {
priceBtn.text = arrayList[0].itemPriceString
}
}
} else {
val sku = bankOfferItem.bundle.name
val list = mutableListOf<String>()
list.add(sku)
purchaseHelper = InAppPurchaseRetry(InAppPurchase(a, Utilities.getApiKey()), 200, 5)
purchaseHelper.setUp(context, object : InAppPurchase.Callback<IabResult> {
override fun onSuccess(p0: IabResult?) {
purchaseHelper.getAllPurchases(list) { p0, p1 ->
try {
p1?.let {
inv = p1
if (it.hasDetails(sku)) {
priceBtn.text = it.getSkuDetails(sku).price
} else
priceBtn.visibility = View.GONE
}
} catch (e: NullPointerException) {
Toast.makeText(context, context.resources.getString(R.string.alert_title_ooops), Toast.LENGTH_SHORT).show()
}
}
}
override fun onError(p0: Exception?) {
priceBtn.visibility = View.GONE
}
})
}
}