android - 在 Parcelable 类中使用 Parcelable 属性的问题
问题描述
我正在尝试实现一个“调查”类型的应用程序,该应用程序需要在活动之间传递数据,以便最终可以将其写入 Excel 文档,因此我需要将具有不同数据类型的实例化类传递给新活动,以便我可以收集更多数据。但是,我正在使用 @Parcelize 并认为它会导致隐藏的样板代码在包裹之间来回弹跳的问题。我希望在不删除 @Parcelize 的情况下有一个解决方案,因为我是 Kotlin 和应用程序开发的新手,但如果没有,那也没关系。
这是长的无限循环错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.raymondllc.testapp, PID: 5396
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:389)
at android.view.View.performClick(View.java:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:384)
at android.view.View.performClick(View.java:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.StackOverflowError: stack size 8MB
at android.os.Parcel$ReadWriteHelper.writeString(Parcel.java:353)
at android.os.Parcel.writeString(Parcel.java:675)
at android.os.Parcel.writeParcelableCreator(Parcel.java:1797)
at android.os.Parcel.writeParcelable(Parcel.java:1790)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
E/AndroidRuntime: at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
I/zygote: Do partial code cache collection, code=59KB, data=48KB
I/zygote: After code cache collection, code=59KB, data=48KB
Increasing code cache capacity to 256KB
I/zygote: Background concurrent copying GC freed 3584(1418KB) AllocSpace objects, 2(1572KB) LOS objects, 17% free, 28MB/34MB, paused 720us total 341.766ms
I/zygote: Background concurrent copying GC freed 184569(14MB) AllocSpace objects, 0(0B) LOS objects, 15% free, 31MB/37MB, paused 671us total 213.138ms
I/chatty: uid=10080(com.raymondllc.testapp) identical 3054 lines
E/AndroidRuntime: at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
E/AndroidRuntime: at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Facility.writeToParcel(Unknown Source:47)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at com.raymondllc.testapp.Building.writeToParcel(Unknown Source:55)
at android.os.Parcel.writeParcelable(Parcel.java:1791)
at android.os.Parcel.writeValue(Parcel.java:1697)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:838)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1542)
at android.os.Bundle.writeToParcel(Bundle.java:1232)
at android.os.Parcel.writeBundle(Parcel.java:878)
at android.content.Intent.writeToParcel(Intent.java:9599)
at android.app.IActivityManager$Stub$Proxy.startActivity(IActivityManager.java:4327)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1611)
at android.app.Activity.startActivityForResult(Activity.java:4487)
at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:68)
at android.app.Activity.startActivityForResult(Activity.java:4445)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:751)
at android.app.Activity.startActivity(Activity.java:4806)
at android.app.Activity.startActivity(Activity.java:4774)
at com.raymondllc.testapp.MainActivity.nextButton(MainActivity.kt:25)
... 11 more
我认为它在“未知来源”中的读/写之间来回弹跳,当我在 Android Studio 中单击时,它会在我编写的两个不同类之间弹跳。以下是类的定义:
@Parcelize
class Facility(private var facID : String,
private var buildings: Array<Building>) : Parcelable {
...
@Parcelize
class Building(private var bldgID: String = "",
private var sections : Array<Section> = emptyArray(),
private var facility: Facility? = null) : Parcelable {
...
非常感谢任何帮助/建议!
编辑 1:
我已经删除了类前面的 @Parcelize 并允许 Android Studio 自动生成样板代码,现在我可以看到问题但不知道如何解决它。writeToParcel
Building 类中的函数调用,writeParcelable(facility, flags)
它调用writeToParcel
Facility 类中的函数,它调用writeTypedArray(building, flags)
,它调用writeToParcel
给定设施中的每个建筑物,依次重复列出的过程直到停止。想法?
解决方案
您将需要打破循环依赖。一种方法是仅存储设施或建筑物的 ID,而不是存储整个对象。您可以编写一个单独的类来存储对象的精简版本,然后使用 Id 重建原始对象。
推荐阅读
- python - 我将如何优化以下熊猫功能?
- angular - Angular observable 处理多个订阅者
- c# - 当同一个表单打开另一个表单时,如何将注意力集中在一个表单上?
- javascript - 在 JavaScript 中执行计算后,如何获取嵌套数组中的所有对象?
- android - 如何拦截一个网页的所有资源网络请求?
- wordpress - WordPress - 将 HTML 消息添加到现有元框
- kubernetes - 如何在 Kubernetes 中切换命名空间
- dart - Flutter - 对齐表格中的文本
- java - 我怎样才能在我的桌子上用百里香叶做柜台?
- angular - 选中复选框后动态显示 mat-table 行