Java Android-带有可序列化回调的DialogFragment在片段销毁时崩溃
我的片段有一个对话框片段,为了在单击对话框按钮时接收回调,我将一个可序列化的接口传递给它的参数 问题是,如果用户切换到android主屏幕,每当显示对话框时,应用程序就会崩溃 注意:根据我的日志,销毁顺序从主片段开始,以对话框片段结束。Java Android-带有可序列化回调的DialogFragment在片段销毁时崩溃,java,android,android-layout,kotlin,android-fragments,Java,Android,Android Layout,Kotlin,Android Fragments,我的片段有一个对话框片段,为了在单击对话框按钮时接收回调,我将一个可序列化的接口传递给它的参数 问题是,如果用户切换到android主屏幕,每当显示对话框时,应用程序就会崩溃 注意:根据我的日志,销毁顺序从主片段开始,以对话框片段结束。 初始化对话框片段的代码: 可序列化回调接口: StackTrace 使用Parcelable而不是Serializable解决了这个问题。然而,我仍然得到一个IllegalArgumentException异常,在导航时说:“当前操作/目标无法从当前目标中
初始化对话框片段的代码:
可序列化回调接口:
StackTrace
使用Parcelable而不是Serializable解决了这个问题。然而,我仍然得到一个IllegalArgumentException异常,在导航时说:“当前操作/目标无法从当前目标中找到”。
但它不会使应用程序崩溃或引起任何副作用(至少在我的应用程序中,我建议您运行测试用例) 注意:以防我用try-catch包住了块 初始化对话框片段的代码: 包裹回拨接口:
Navigation.findNavController(binding.root).navigate(GameFragmentDirections.actionGameFragmentToPauseDialogFragment(
object : PauseDialogFragment.ResumeGameListener
{
override fun onResume()
{
isGamePaused = false
onStartGame(_screenSizePairXY)
}
}))
interface ResumeGameListener : Serializable
{
fun onResume()
}
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = ui.game.GameFragment$onGameOver$1)
at android.os.Parcel.writeSerializable(Parcel.java:1714)
at android.os.Parcel.writeValue(Parcel.java:1662)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:875)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1579)
at android.os.Bundle.writeToParcel(Bundle.java:1233)
at android.os.Parcel.writeBundle(Parcel.java:915)
at androidx.fragment.app.FragmentState.writeToParcel(FragmentState.java:125)
at android.os.Parcel.writeTypedObject(Parcel.java:1516)
at android.os.Parcel.writeTypedList(Parcel.java:1395)
at android.os.Parcel.writeTypedList(Parcel.java:1380)
at androidx.fragment.app.FragmentManagerState.writeToParcel(FragmentManagerState.java:51)
at android.os.Parcel.writeParcelable(Parcel.java:1683)
at android.os.Parcel.writeValue(Parcel.java:1589)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:875)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1579)
at android.os.Bundle.writeToParcel(Bundle.java:1233)
at android.os.Parcel.writeBundle(Parcel.java:915)
at androidx.fragment.app.FragmentState.writeToParcel(FragmentState.java:127)
at android.os.Parcel.writeTypedObject(Parcel.java:1516)
at android.os.Parcel.writeTypedList(Parcel.java:1395)
at android.os.Parcel.writeTypedList(Parcel.java:1380)
at androidx.fragment.app.FragmentManagerState.writeToParcel(FragmentManagerState.java:51)
at android.os.Parcel.writeParcelable(Parcel.java:1683)
at android.os.Parcel.writeValue(Parcel.java:1589)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:875)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1579)
at android.os.Bundle.writeToParcel(Bundle.java:1233)
at android.app.IActivityManager$Stub$Proxy.activityStopped(IActivityManager.java:4008)
at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:144)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6762)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.io.NotSerializableException: com.developerkurt.ghosky.ui.game.GameFragment
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1240)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1604)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1565)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1488)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1234)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:354)
at android.os.Parcel.writeSerializable(Parcel.java:1709)
at android.os.Parcel.writeValue(Parcel.java:1662)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:875)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1579)
at android.os.Bundle.writeToParcel(Bundle.java:1233)
at android.os.Parcel.writeBundle(Parcel.java:915)
at androidx.fragment.app.FragmentState.writeToParcel(FragmentState.java:125)
at android.os.Parcel.writeTypedObject(Parcel.java:1516)
at android.os.Parcel.writeTypedList(Parcel.java:1395)
at android.os.Parcel.writeTypedList(Parcel.java:1380)
at androidx.fragment.app.FragmentManagerState.writeToParcel(FragmentManagerState.java:51)
at android.os.Parcel.writeParcelable(Parcel.java:1683)
at android.os.Parcel.writeValue(Parcel.java:1589)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:875)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1579)
at android.os.Bundle.writeToParcel(Bundle.java:1233)
at android.os.Parcel.writeBundle(Parcel.java:915)
at androidx.fragment.app.FragmentState.writeToParcel(FragmentState.java:127)
at android.os.Parcel.writeTypedObject(Parcel.java:1516)
at android.os.Parcel.writeTypedList(Parcel.java:1395)
at android.os.Parcel.writeTypedList(Parcel.java:1380)
at androidx.fragment.app.FragmentManagerState.writeToParcel(FragmentManagerState.java:51)
at android.os.Parcel.writeParcelable(Parcel.java:1683)
at android.os.Parcel.writeValue(Parcel.java:1589)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:875)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1579)
at android.os.Bundle.writeToParcel(Bundle.java:1233)
at android.app.IActivityManager$Stub$Proxy.activityStopped(IActivityManager.java:4008)
at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:144)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6762)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
try
{
Navigation.findNavController(binding.root).navigate(GameFragmentDirections.actionGameFragmentToPauseDialogFragment(
object : PauseDialogFragment.ResumeGameListener
{
override fun onResume()
{
isGamePaused = false
onStartGame(_screenSizePairXY)
}
override fun writeToParcel(p0: Parcel?, p1: Int)
{
}
override fun describeContents(): Int = 0
}))
}
catch (e: Exception)
{
Timber.w(e.fillInStackTrace())
}
interface ResumeGameListener : Parcelable
{
fun onResume()
}