Fixed
Status Update
Comments
il...@google.com <il...@google.com> #2
[Deleted User] <[Deleted User]> #3
Project: platform/frameworks/support
Branch: androidx-master-dev
commit 1cb6e0067fb2ccd9cf46557bf14cf2e28149bca3
Author: Rahul Ravikumar <rahulrav@google.com>
Date: Tue Jan 15 14:24:59 2019
WorkerWrapper ensures that work which has been backed off runs per schedule.
Test: Added unit tests.
Change-Id: Iadb5fc47f021783c692167af23dba9564e96c244
Fixes: b/122881597
M work/workmanager/src/androidTest/java/androidx/work/impl/WorkerWrapperTest.java
M work/workmanager/src/main/java/androidx/work/impl/WorkerWrapper.java
https://android-review.googlesource.com/873094
Branch: androidx-master-dev
commit 1cb6e0067fb2ccd9cf46557bf14cf2e28149bca3
Author: Rahul Ravikumar <rahulrav@google.com>
Date: Tue Jan 15 14:24:59 2019
WorkerWrapper ensures that work which has been backed off runs per schedule.
Test: Added unit tests.
Change-Id: Iadb5fc47f021783c692167af23dba9564e96c244
Fixes:
M work/workmanager/src/androidTest/java/androidx/work/impl/WorkerWrapperTest.java
M work/workmanager/src/main/java/androidx/work/impl/WorkerWrapper.java
il...@google.com <il...@google.com> #4
Yeah, we should automatically be setting the ClassLoader (using context.getClassLoader()) on all of the Bundles restored to NavController, including:
- the Bundles we pass to Navigator.onRestoreState()
- the Bundles we extract from mBackStackArgsToRestore that are eventually passed through to onDestinationChanged
The reason this only appears when you use something like 'Don't keep activities' is because the ClassLoader is lost only when the Bundles are parceled and then unparceled.
As a workaround, you can add the following code to your MainActivity:
navController.addOnDestinationChangedListener { _, _, arguments ->
arguments?.classLoader = classLoader
}
Make sure to add it before any calls to NavigationUI, etc so that it runs before those other OnDestinationChangedListeners
- the Bundles we pass to Navigator.onRestoreState()
- the Bundles we extract from mBackStackArgsToRestore that are eventually passed through to onDestinationChanged
The reason this only appears when you use something like 'Don't keep activities' is because the ClassLoader is lost only when the Bundles are parceled and then unparceled.
As a workaround, you can add the following code to your MainActivity:
navController.addOnDestinationChangedListener { _, _, arguments ->
arguments?.classLoader = classLoader
}
Make sure to add it before any calls to NavigationUI, etc so that it runs before those other OnDestinationChangedListeners
ap...@google.com <ap...@google.com> #5
Project: platform/frameworks/support
Branch: androidx-master-dev
commit d5cde52c2a4392aca828ef78ffed9f2405711587
Author: jbwoods <jbwoods@google.com>
Date: Thu Feb 07 10:34:04 2019
Set ClassLoader on Bundles restored to NavController
Classloader for Custom Parcelable classes when bundles
are parceled and then unparceled. This can cause applications
to crash when restoring from a previously closed activity.
This should stop crashing when activities are not kept.
Test: Added new test for Restoring the state and restoring backstackArgs
BUG: 123893858
Change-Id: I25736c7f95bed8d6202b9ee7a8697dd6c8a0222b
M navigation/runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
M navigation/runtime/src/main/java/androidx/navigation/NavController.java
https://android-review.googlesource.com/898093
https://goto.google.com/android-sha1/d5cde52c2a4392aca828ef78ffed9f2405711587
Branch: androidx-master-dev
commit d5cde52c2a4392aca828ef78ffed9f2405711587
Author: jbwoods <jbwoods@google.com>
Date: Thu Feb 07 10:34:04 2019
Set ClassLoader on Bundles restored to NavController
Classloader for Custom Parcelable classes when bundles
are parceled and then unparceled. This can cause applications
to crash when restoring from a previously closed activity.
This should stop crashing when activities are not kept.
Test: Added new test for Restoring the state and restoring backstackArgs
BUG: 123893858
Change-Id: I25736c7f95bed8d6202b9ee7a8697dd6c8a0222b
M navigation/runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
M navigation/runtime/src/main/java/androidx/navigation/NavController.java
il...@google.com <il...@google.com> #6
This is fixed internally and will be available in Navigation 1.0.0-beta02
Description
Version used: 1.0.0-alpha11
Devices/Android versions reproduced on: irrelevant
I have a fragment like this:
<fragment
android:id="@+id/teamDetailFragment"
android:name="com.optima_apps.fkcz.ui.team.teamdetail.TeamDetailFragment"
android:label="{player_name}" <== PARAMETRIZED LABEL (from a plain string argument)
tools:layout="@layout/fragment_team_detail">
<argument
android:name="player"
app:argType="com.optima_apps.fkcz.models.Player" /> <== CUSTOM CLASS ARG TYPE
<argument
android:name="player_name"
app:argType="string" />
</fragment>
When parametrized label is used in combination with custom class argument type on a fragment, the app crashes when activity is recreated with a saved instance state. To reproduce, have a fragment configured as shown above, then in Developer Options enable "Don't keep activites" to force activity to destroy as soon as you leave it, then return to activity and it should crash like below:
2019-02-05 12:57:22.012 5790-5790/com.optima_apps.fkcz E/Parcel: Class not found when unmarshalling: com.optima_apps.fkcz.models.Player
java.lang.ClassNotFoundException: com.optima_apps.fkcz.models.Player
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:400)
at android.os.Parcel.readParcelableCreator(Parcel.java:2489)
at android.os.Parcel.readParcelable(Parcel.java:2443)
at android.os.Parcel.readValue(Parcel.java:2346)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2698)
at android.os.BaseBundle.unparcel(BaseBundle.java:269)
at android.os.BaseBundle.containsKey(BaseBundle.java:345)
at androidx.navigation.ui.AbstractAppBarOnDestinationChangedListener.onDestinationChanged(AbstractAppBarOnDestinationChangedListener.java:90)
at androidx.navigation.ui.ToolbarOnDestinationChangedListener.onDestinationChanged(ToolbarOnDestinationChangedListener.java:57)
at androidx.navigation.NavController.addOnDestinationChangedListener(NavController.java:218)
at androidx.navigation.ui.NavigationUI.setupWithNavController(NavigationUI.java:292)
at androidx.navigation.ui.NavigationUI.setupWithNavController(NavigationUI.java:241)
at com.optima_apps.fkcz.FKCZActivity.onCreate(FKCZActivity.kt:41)
at android.app.Activity.performCreate(Activity.java:6915)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2746)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2864)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6523)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
Caused by: java.lang.ClassNotFoundException: com.optima_apps.fkcz.models.Player
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:1346)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:1406)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:400)
at android.os.Parcel.readParcelableCreator(Parcel.java:2489)
at android.os.Parcel.readParcelable(Parcel.java:2443)
at android.os.Parcel.readValue(Parcel.java:2346)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2698)
at android.os.BaseBundle.unparcel(BaseBundle.java:269)
at android.os.BaseBundle.containsKey(BaseBundle.java:345)
at androidx.navigation.ui.AbstractAppBarOnDestinationChangedListener.onDestinationChanged(AbstractAppBarOnDestinationChangedListener.java:90)
at androidx.navigation.ui.ToolbarOnDestinationChangedListener.onDestinationChanged(ToolbarOnDestinationChangedListener.java:57)
at androidx.navigation.NavController.addOnDestinationChangedListener(NavController.java:218)
at androidx.navigation.ui.NavigationUI.setupWithNavController(NavigationUI.java:292)
at androidx.navigation.ui.NavigationUI.setupWithNavController(NavigationUI.java:241)
at com.optima_apps.fkcz.FKCZActivity.onCreate(FKCZActivity.kt:41)
at android.app.Activity.performCreate(Activity.java:6915)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2746)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2864)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6523)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
I have already Googled this a bit and this could be the solution:
When I change the label to be a static string, the library never goes into part of code that's crashing, and everything works properly, so I'm sure the issue is not on my side.
If you need any additional info I'm here.