Serializable传入fragment之后app进入后台运行时报错的问题

头发还没秃a 2016-11-17 02:08:41
我有一个bean对象:

public class TitleViewBean implements Serializable {

private long tag;
private TextView mTitleView;
private Fragment mFragment;
private String titleStr;

public TitleViewBean(long tag, TextView mTitleView){
this.tag = tag;
this.mTitleView = mTitleView;
}

public void setTag(long tag){
this.tag = tag;
}

public Long getTag(){
return tag;
}

public void setTextView(TextView mTextView){
this.mTitleView = mTextView;
}

public TextView getTextView(){
return mTitleView;
}

public void setFragment(Fragment fragment){
this.mFragment = fragment;
}

public Fragment getFragment(){
return mFragment;
}

public void setTitleStr(String title){
this.titleStr = title;
}

public String getTitleStr(){
return titleStr;
}

}


传入fragment的时候是正常的:

TitleViewBean titleViewBean = new TitleViewBean(tag, mTitleView);
CourseTitleFragment mFragment = new CourseTitleFragment();
titleViewBean.setFragment(mFragment);
Bundle bundle = new Bundle();
bundle.putSerializable("dataBean", titleViewBean);
mFragment.setArguments(bundle);


但是在进入到这个fragment之后app进入运行就报以下错误:

FATAL EXCEPTION: main
Process: com.szfore.microlessonhelper, PID: 18702
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.***.***.bean.TitleViewBean)
at android.os.Parcel.writeSerializable(Parcel.java:1394)
at android.os.Parcel.writeValue(Parcel.java:1341)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:644)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)
at android.os.Bundle.writeToParcel(Bundle.java:1034)
at android.os.Parcel.writeBundle(Parcel.java:669)
at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:144)
at android.os.Parcel.writeTypedArray(Parcel.java:1197)
at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:398)
at android.os.Parcel.writeParcelable(Parcel.java:1363)
at android.os.Parcel.writeValue(Parcel.java:1268)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:644)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)
at android.os.Bundle.writeToParcel(Bundle.java:1034)
at android.os.Parcel.writeBundle(Parcel.java:669)
at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3128)


请问是因为我这bean对象里面存有TextView 和Fragment实例造成的么?
这个问题需要怎么解决呢?
...全文
179 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
头发还没秃a 2016-11-18
  • 打赏
  • 举报
回复
引用 3 楼 xvjianzhe 的回复:
[quote=引用 2 楼 zhumj_zhumj 的回复:] [quote=引用 1 楼 xvjianzhe 的回复:] 首先:将Fragment这种组件作为Bean属性就是错误的设计,这是你设计上的缺陷! 其次:Fragment的类声明源码如下: public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListener {} 从代码可以看出,它是没有实现Serializable 接口的,所以,你不可能将它序列化。 最后:看楼主的代码应该是想将某个Fragment传递到某个Fragment中。这种想法在Android 平台上就是错误的, Fragment作为一个UI容器组件,它负责显示数据,呈现内容,是不具备传递载体能力的,你可以将数据从一个Fragment传递给另一个Fragment显示,而不是将一个Fragment传递给另一个Fragment显示。
但是为什么在进入页面的时候没有报错,而在进入后台运行之后才报错呢?[/quote] 进入页面的时候,Bean中的Fragment并不会被序列化,而是作为一个引用实例传递进去,当进入后台的时候,当你进入后台的时候,系统会对一些数据进行状态保存,这个时候会进行序列化,当序列化Bean的时候,会依次序列化里面的每个属性,这个时候,如果Fragment这个属性,没有实现序列化接口,就会报异常[/quote] 哦哦,谢谢你的回答
daydreary 2016-11-17
  • 打赏
  • 举报
回复
代码不能这么写的,早点改了吧
执着的前进 2016-11-17
  • 打赏
  • 举报
回复
引用 2 楼 zhumj_zhumj 的回复:
[quote=引用 1 楼 xvjianzhe 的回复:] 首先:将Fragment这种组件作为Bean属性就是错误的设计,这是你设计上的缺陷! 其次:Fragment的类声明源码如下: public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListener {} 从代码可以看出,它是没有实现Serializable 接口的,所以,你不可能将它序列化。 最后:看楼主的代码应该是想将某个Fragment传递到某个Fragment中。这种想法在Android 平台上就是错误的, Fragment作为一个UI容器组件,它负责显示数据,呈现内容,是不具备传递载体能力的,你可以将数据从一个Fragment传递给另一个Fragment显示,而不是将一个Fragment传递给另一个Fragment显示。
但是为什么在进入页面的时候没有报错,而在进入后台运行之后才报错呢?[/quote] 进入页面的时候,Bean中的Fragment并不会被序列化,而是作为一个引用实例传递进去,当进入后台的时候,当你进入后台的时候,系统会对一些数据进行状态保存,这个时候会进行序列化,当序列化Bean的时候,会依次序列化里面的每个属性,这个时候,如果Fragment这个属性,没有实现序列化接口,就会报异常
头发还没秃a 2016-11-17
  • 打赏
  • 举报
回复
引用 1 楼 xvjianzhe 的回复:
首先:将Fragment这种组件作为Bean属性就是错误的设计,这是你设计上的缺陷! 其次:Fragment的类声明源码如下: public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListener {} 从代码可以看出,它是没有实现Serializable 接口的,所以,你不可能将它序列化。 最后:看楼主的代码应该是想将某个Fragment传递到某个Fragment中。这种想法在Android 平台上就是错误的, Fragment作为一个UI容器组件,它负责显示数据,呈现内容,是不具备传递载体能力的,你可以将数据从一个Fragment传递给另一个Fragment显示,而不是将一个Fragment传递给另一个Fragment显示。
但是为什么在进入页面的时候没有报错,而在进入后台运行之后才报错呢?
执着的前进 2016-11-17
  • 打赏
  • 举报
回复
首先:将Fragment这种组件作为Bean属性就是错误的设计,这是你设计上的缺陷! 其次:Fragment的类声明源码如下: public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListener {} 从代码可以看出,它是没有实现Serializable 接口的,所以,你不可能将它序列化。 最后:看楼主的代码应该是想将某个Fragment传递到某个Fragment中。这种想法在Android 平台上就是错误的, Fragment作为一个UI容器组件,它负责显示数据,呈现内容,是不具备传递载体能力的,你可以将数据从一个Fragment传递给另一个Fragment显示,而不是将一个Fragment传递给另一个Fragment显示。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧