Ho una sottoclasse di android.support.v7.widget.RecyclerView. Funziona bene quando uso l'applicazione e il test.java.lang.IncompatibleClassChangeError quando include espresso-contrib: 2.0
Tuttavia, quando includo espresso-contrib nel mio file dell'app gradle ottengo un'eccezione quando provo a eseguire gli stessi test. L'app funziona ancora. Lo stesso problema si verifica in entrambe le versioni sdk 21 e 22, su emulatore e dispositivo armv. Usando un emulatore x86 invece seguraults.
Gradle
androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.0'
Eccezione
java.lang.IncompatibleClassChangeError: xxx.DashboardActivity$1
at dalvik.system.DexFile.defineClassNative(Native Method)
at dalvik.system.DexFile.defineClass(DexFile.java:226)
at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:219)
at dalvik.system.DexPathList.findClass(DexPathList.java:321)
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at xxx.DashboardActivity.onCreate(DashboardActivity.java:54)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.support.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:346)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
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:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
adb logcat
I/ActivityManager(1229): START u0 {act=android.intent.action.MAIN flg=0x14000000 cmp=xxx/.activities.DashboardActivity} from uid 10059 on display 0
V/WindowManager(1229): addAppToken: AppWindowToken{65964e3 token=Token{3f63d512 ActivityRecord{19743c9d u0 xxx/.activities.DashboardActivity t13}}} to stack=1 task=13 at 0
D/LifecycleMonitor(2953): Lifecycle status change: [email protected] in: PRE_ON_CREATE
V/WindowManager(1229): Adding window Window{2d974c1a u0 Starting xxx} at 2 of 7 (after Window{27a98488 u0 com.android.launcher/com.android.launcher2.Launcher})
W/RecyclerView(2953): setScrollingTouchSlop(): bad argument constant 315513600; using default value
W/art (2953): Incompatible structural change detected: Structural change of android.support.v7.widget.RecyclerView$Adapter is hazardous (/data/dalvik-cache/x86/[email protected]@[email protected]
[email protected] at compile time, /data/dalvik-cache/x86/[email protected]@[email protected]@classes.dex at runtime): Virtual method count off: 26 vs 25
W/art (2953): Landroid/support/v7/widget/RecyclerView$Adapter; (Compile time):
W/art (2953): Static fields:
W/art (2953): Instance fields:
W/art (2953): Z mHasStableIds
W/art (2953): Landroid/support/v7/widget/RecyclerView$AdapterDataObservable; mObservable
W/art (2953): Direct methods:
W/art (2953): <init>()V
W/art (2953): Virtual methods:
W/art (2953): bindViewHolder(Landroid/support/v7/widget/RecyclerView$ViewHolder;I)V
W/art (2953): createViewHolder(Landroid/view/ViewGroup;I)Landroid/support/v7/widget/RecyclerView$ViewHolder;
W/art (2953): getItemCount()I
W/art (2953): getItemId(I)J
W/art (2953): getItemViewType(I)I
W/art (2953): hasObservers()Z
W/art (2953): hasStableIds()Z
W/art (2953): notifyDataSetChanged()V
W/art (2953): notifyItemChanged(I)V
W/art (2953): notifyItemInserted(I)V
W/art (2953): notifyItemMoved(II)V
W/art (2953): notifyItemRangeChanged(II)V
W/art (2953): notifyItemRangeInserted(II)V
W/art (2953): notifyItemRangeRemoved(II)V
W/art (2953): notifyItemRemoved(I)V
W/art (2953): onAttachedToRecyclerView(Landroid/support/v7/widget/RecyclerView;)V
W/art (2953): onBindViewHolder(Landroid/support/v7/widget/RecyclerView$ViewHolder;I)V
W/art (2953): onCreateViewHolder(Landroid/view/ViewGroup;I)Landroid/support/v7/widget/RecyclerView$ViewHolder;
W/art (2953): onDetachedFromRecyclerView(Landroid/support/v7/widget/RecyclerView;)V
W/art (2953): onFailedToRecycleView(Landroid/support/v7/widget/RecyclerView$ViewHolder;)Z
W/art (2953): onViewAttachedToWindow(Landroid/support/v7/widget/RecyclerView$ViewHolder;)V
W/art (2953): onViewDetachedFromWindow(Landroid/support/v7/widget/RecyclerView$ViewHolder;)V
W/art (2953): onViewRecycled(Landroid/support/v7/widget/RecyclerView$ViewHolder;)V
W/art (2953): registerAdapterDataObserver(Landroid/support/v7/widget/RecyclerView$AdapterDataObserver;)V
W/art (2953): setHasStableIds(Z)V
W/art (2953): unregisterAdapterDataObserver(Landroid/support/v7/widget/RecyclerView$AdapterDataObserver;)V
W/art (2953): Landroid/support/v7/widget/RecyclerView$Adapter; (Runtime):
W/art (2953): Static fields:
W/art (2953): Instance fields:
W/art (2953): Z mHasStableIds
W/art (2953): Landroid/support/v7/widget/RecyclerView$AdapterDataObservable; mObservable
W/art (2953): Direct methods:
W/art (2953): <init>()V
W/art (2953): Virtual methods:
W/art (2953): bindViewHolder(Landroid/support/v7/widget/RecyclerView$ViewHolder;I)V
W/art (2953): createViewHolder(Landroid/view/ViewGroup;I)Landroid/support/v7/widget/RecyclerView$ViewHolder;
W/art (2953): getItemCount()I
W/art (2953): getItemId(I)J
W/art (2953): getItemViewType(I)I
W/art (2953): hasObservers()Z
W/art (2953): hasStableIds()Z
W/art (2953): notifyDataSetChanged()V
W/art (2953): notifyItemChanged(I)V
W/art (2953): notifyItemInserted(I)V
W/art (2953): notifyItemMoved(II)V
W/art (2953): notifyItemRangeChanged(II)V
W/art (2953): notifyItemRangeInserted(II)V
W/art (2953): notifyItemRangeRemoved(II)V
W/art (2953): notifyItemRemoved(I)V
W/art (2953): onAttachedToRecyclerView(Landroid/support/v7/widget/RecyclerView;)V
W/art (2953): onBindViewHolder(Landroid/support/v7/widget/RecyclerView$ViewHolder;I)V
W/art (2953): onCreateViewHolder(Landroid/view/ViewGroup;I)Landroid/support/v7/widget/RecyclerView$ViewHolder;
W/art (2953): onDetachedFromRecyclerView(Landroid/support/v7/widget/RecyclerView;)V
W/art (2953): onViewAttachedToWindow(Landroid/support/v7/widget/RecyclerView$ViewHolder;)V
W/art (2953): onViewDetachedFromWindow(Landroid/support/v7/widget/RecyclerView$ViewHolder;)V
W/art (2953): onViewRecycled(Landroid/support/v7/widget/RecyclerView$ViewHolder;)V
W/art (2953): registerAdapterDataObserver(Landroid/support/v7/widget/RecyclerView$AdapterDataObserver;)V
W/art (2953): setHasStableIds(Z)V
W/art (2953): unregisterAdapterDataObserver(Landroid/support/v7/widget/RecyclerView$AdapterDataObserver;)V
I/art (2953): Rejecting re-init on previously-failed class java.lang.Class<xxx.models.JSONArrayRecyclerViewAdapter>
I/art (2953): Rejecting re-init on previously-failed class java.lang.Class<xxx.models.JSONArrayRecyclerViewAdapter>
I/art (2953): Rejecting re-init on previously-failed class java.lang.Class<xxx.activities.DashboardActivity$1>
I/art (2953): Rejecting re-init on previously-failed class java.lang.Class<xxx.activities.DashboardActivity$1>
D/AndroidRuntime(2953): Shutting down VM
E/MonitoringInstrumentation(2953): Exception encountered by: Thread[main,5,main]. Dumping thread state to outputs and pining for the fjords.
E/MonitoringInstrumentation(2953): java.lang.IncompatibleClassChangeError: xxx.activities.DashboardActivity$1
E/MonitoringInstrumentation(2953): at dalvik.system.DexFile.defineClassNative(Native Method)
E/MonitoringInstrumentation(2953): at dalvik.system.DexFile.defineClass(DexFile.java:226)
E/MonitoringInstrumentation(2953): at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:219)
E/MonitoringInstrumentation(2953): at dalvik.system.DexPathList.findClass(DexPathList.java:321)
E/MonitoringInstrumentation(2953): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54)
E/MonitoringInstrumentation(2953): at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
E/MonitoringInstrumentation(2953): at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
E/MonitoringInstrumentation(2953): at xxx.activities.DashboardActivity.onCreate(DashboardActivity.java:54)
E/MonitoringInstrumentation(2953): at android.app.Activity.performCreate(Activity.java:5990)
E/MonitoringInstrumentation(2953): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
E/MonitoringInstrumentation(2953): at android.support.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:346)
E/MonitoringInstrumentation(2953): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
E/MonitoringInstrumentation(2953): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
E/MonitoringInstrumentation(2953): at android.app.ActivityThread.access$800(ActivityThread.java:151)
E/MonitoringInstrumentation(2953): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
E/MonitoringInstrumentation(2953): at android.os.Handler.dispatchMessage(Handler.java:102)
E/MonitoringInstrumentation(2953): at android.os.Looper.loop(Looper.java:135)
E/MonitoringInstrumentation(2953): at android.app.ActivityThread.main(ActivityThread.java:5257)
E/MonitoringInstrumentation(2953): at java.lang.reflect.Method.invoke(Native Method)
E/MonitoringInstrumentation(2953): at java.lang.reflect.Method.invoke(Method.java:372)
E/MonitoringInstrumentation(2953): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
E/MonitoringInstrumentation(2953): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Sembra" onFailedToRecycleView (Landroid/supporto/v7/widget/RecyclerView $ ViewHolder;) 'è la differenza. La mia ipotesi è che contrib-espresso provi a sostituire una classe o un'interfaccia ma non implementa tutti i metodi? Ancora non so come aggiustarlo. – seppo0010