IllegalArgumentException: pointerIndex außerhalb der Reichweite von SwipeRefreshLayout
Ich habe immer einige dieser IllegalArgumentException: pointerIndex out of range
stürzt auf crashlytics und ich verstehe nicht, was passiert. Es ist nicht beschränkt auf ein android build oder das Gerät, es kommt auf 5.0.1, 4.4.4, 4.4.2, 4.0.4, 2.3.6 alle auf verschiedenen Geräten. Unten ist die vollständige log-Ausgabe für mehr Kontext.
java.lang.RuntimeException: Unable to destroy activity {com.mypackage.myapp/com.mypackage.myapp.MyListActivity}: java.lang.IllegalArgumentException: pointerIndex out of range
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3671)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3689)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3889)
at android.app.ActivityThread.access$900(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
Caused by: java.lang.IllegalArgumentException: pointerIndex out of range
at android.view.MotionEvent.nativeGetAxisValue(MotionEvent.java)
at android.view.MotionEvent.getY(MotionEvent.java:1998)
at android.support.v4.view.MotionEventCompatEclair.getY(MotionEventCompatEclair.java:35)
at android.support.v4.view.MotionEventCompat$EclairMotionEventVersionImpl.getY(MotionEventCompat.java:95)
at android.support.v4.view.MotionEventCompat.getY(MotionEventCompat.java:228)
at android.support.v4.widget.SwipeRefreshLayout.onTouchEvent(SwipeRefreshLayout.java:772)
at android.view.View.dispatchTouchEvent(View.java:8388)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2398)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2158)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2400)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172)
at android.view.ViewGroup.cancelTouchTarget(ViewGroup.java:2340)
at android.view.ViewGroup.removeViewInternal(ViewGroup.java:4156)
at android.view.ViewGroup.removeViewInternal(ViewGroup.java:4136)
at android.view.ViewGroup.removeView(ViewGroup.java:4068)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1045)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1108)
at android.support.v4.app.FragmentManagerImpl.dispatchDestroy(FragmentManager.java:1954)
at android.support.v4.app.FragmentActivity.onDestroy(FragmentActivity.java:313)
at android.support.v7.app.ActionBarActivity.onDestroy(ActionBarActivity.java:169)
at com.mypackage.myapp.BaseActivity.onDestroy(BaseActivity.java:105)
at android.app.Activity.performDestroy(Activity.java:6112)
at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1140)
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3658)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3689)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3889)
at android.app.ActivityThread.access$900(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
Hier ist eine andere Verwandte crash-Bericht aus android.view.MotionEvent.getY()
.
java.lang.RuntimeException: Unable to destroy activity {com.mypackage.myapp/com.mypackage.myapp.MyListActivity}: java.lang.ArrayIndexOutOfBoundsException
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:2683)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:2701)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.access$1600(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:946)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3733)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:931)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:689)
at dalvik.system.NativeStart.main(NativeStart.java)
Caused by: java.lang.ArrayIndexOutOfBoundsException
at android.view.MotionEvent.getY(MotionEvent.java:903)
at android.support.v4.view.MotionEventCompatEclair.d(MotionEventCompatEclair.java:35)
at android.support.v4.view.MotionEventCompat$EclairMotionEventVersionImpl.d(MotionEventCompat.java:95)
at android.support.v4.view.MotionEventCompat.d(MotionEventCompat.java:228)
at android.support.v4.widget.SwipeRefreshLayout.onTouchEvent(SwipeRefreshLayout.java:772)
at android.view.View.dispatchTouchEvent(View.java:3971)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:903)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1154)
at android.view.ViewGroup.removeViewInternal(ViewGroup.java:2201)
at android.view.ViewGroup.removeViewInternal(ViewGroup.java:2187)
at android.view.ViewGroup.removeView(ViewGroup.java:2135)
at android.support.v4.app.FragmentManagerImpl.a(FragmentManager.java:1045)
at android.support.v4.app.FragmentManagerImpl.a(FragmentManager.java:1126)
at android.support.v4.app.FragmentManagerImpl.a(FragmentManager.java:1108)
at android.support.v4.app.FragmentManagerImpl.t(FragmentManager.java:1954)
at android.support.v4.app.FragmentActivity.onDestroy(FragmentActivity.java:313)
at android.support.v7.app.ActionBarActivity.onDestroy(ActionBarActivity.java:169)
at com.mypackage.myapp.BaseActivity.onDestroy(BaseActivity.java:105)
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:2670)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:2701)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.access$1600(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:946)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3733)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:931)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:689)
at dalvik.system.NativeStart.main(NativeStart.java)
Also meine Frage ist, was verursacht diesen Fehler, und was wäre die akzeptable Methode zur Abschwächung dieses Problems tun?
EDIT: Hier ist der link zu MotionEvent.java:1998 die verwiesen wird, in der crash oben.
EDIT: Hier ist mein onDestroy aussieht:
@Override
public void onDestroy() {
AppMsg.cancelAll();
SuperCardToast.cancelAllSuperCardToasts();
super.onDestroy();
}
Speziell BaseActivity.java:105
ist, wo ich anrufen super.onDestroy();
.
- sind Sie in der Lage zu replizieren ?
- Nein. Das ist nicht aus einem Mangel an versuchen aber. Ich habe Affen laufen auf der app-100,000,000 Ereignisse zu einem Zeitpunkt und ich war noch nicht in der Lage zu bekommen, dieser Absturz
- Wie diesen Fehler zu reproduzieren?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vermute, dass die exception geworfen wird, während es einen Hauch Ereignis noch auftreten (gestreamt auf die native touch, während die Aktivität zu
onDestroy()
. Es ist ok, dies zu umgehen, durch das abfangen der Ausnahme im Interesse der Vermeidung Absturz. Aktivität zerstört werden, wenn es in diesen Zustand eintreten.Ich bin mir nicht sicher (noch nicht getestet), aber Sie könnten versuchen, zu verhindern, dass irgendwelche Ereignisse übergeben werden, die die Implementierung, wenn fallende Ausnahme nicht passt.
oder
2:
SwipeRefreshLayout versucht, getY() von ungültigen Zeiger-index, ruft
findPointerIndex(ev, activePointer)
zurück-1
wenn es nicht zu finden. Verhindert die Versendung touch-Ereignis mit ungültigen Zeiger weniger als 0 und Zeiger index größer oder gleich als Zeiger zählen für das event wird wahrscheinlich verhindern, dass die Validierung der Zeiger innerhalb native MotionEvent Umsetzung von werfen IAE.ACTION_CANCEL
geliefert werden, wie Sie sollten. Dieses Korrektiv der Logik, sollten Sie nicht stören Umgang mit anderen Veranstaltungen in der original-Implementierung.onTouchEvent
stattIst es bereits angemeldet bei AOSP issue tracker.
Können Sie es beheben, indem subclasing die
SwipeRefreshLayout
und die exception zu fangen, wie:Wenn Sie nicht sehen, jedes scheinbare problem in Ihrer app, können Sie versuchen, verwenden Sie eine benutzerdefinierte "silent" - version des
SwipeRefreshLayout
:Für alle, die noch suchen, ich sah diese, wenn der touch-Ereignisse waren in Konflikt mit den navigation drawer. Ich habe einen check in der onTouch meiner Tätigkeit
Und es scheint besser zu sein. in NavigationDrawerFragment:
und zurück
mIsDrawerOpen
imisDrawerOpen()
Gesehen ich habe eine ähnliche Fehlermeldung, wenn die Anzahl der Elemente in einem ViewPager (die sich ViewGroup) wurde falsch eingestellt. So ist die app nennen würde
android.view.MotionEvent.getY(10)
da waren die 10 (nicht 11) der Elemente in der Liste. Sie könnten versuchen, Debuggen, indem man die Anzahl der was ist in der ViewGroup.Würd mich auch interessieren, zu wissen, was in Ihrem com.MeinPaket.myapp.BaseActivity.onDestroy-Methode.
Ebenfalls, sah ich das, es ist offenbar ein bug in Eclair: https://stackoverflow.com/a/16519902/2832027
Könnte es sein, es war ein bug in Eclair, das wurde behoben aber einige Leute haben nicht das update, wenn es gut funktioniert für Ihre version von Eclair?
UPDATE: Blick auf Ihre onDestroy-Methode und die Fehler - Es sieht aus wie Aufruf von onDestroy auslösen können, zu einer letzten Veranstaltung in die ViewGroup, dass Anrufe auf die Letzte Ansicht in der Gruppe, die angezeigt wurde. Könnte
AppMsg.cancelAll()
oderSuperCardToast.cancelAllSuperCardToasts()
zerstören diese Ansichten? Könnten Sie das super.onDestroy (), bevor Sie in Ihre onDestroy-Methode?Obwohl, wenn dies das problem ist, es ist seltsam, dass Sie nicht replizieren es selbst. Es könnte auch ein Problem mit der Länge von Benutzern ViewGroup vs Ihre eigenen. Wenn Sie sehr kurze ViewGroups können Sie replizieren den Fehler?
Fehler-logs, die Sie zeigen, scheinen nur für Eclair und doch Sie sagen, das Problem tritt auf allen Geräten. Kannst du ein Fehlerprotokoll für nicht-Eclair-Gerät?
Wie es scheint, innerhalb der onTouchEvent von SwipeRefreshLayout Sie soeben den pointerId Validierung auf ACTION_CANCEL aber nicht Hinzugefügt, die pointerIndex überprüfung, die verfügbar ist für ACTION_MOVE . Also habe ich eine custom class für Sie und behandeln Sie für ACTION_CANCEL & ACTION_UP.
Bisher alles richtig funktioniert und werde zu release ein update der app bald. Wenn noch zu bekommen-ohne Ausnahme-auf crashlytics dann werde ich meine Lösung. Bis zu jener Zeit, Genießen Sie 🙂
public class SwipeRefreshLayoutX erstreckt SwipeRefreshLayout {
}