gpt4 book ai didi

android - 为什么我可以通过 Bundle 传递带有位图的可序列化对象,但在系统尝试对其进行序列化时却出现错误?

转载 作者:搜寻专家 更新时间:2023-11-01 08:50:01 26 4
gpt4 key购买 nike

所以我有一个类,带有实现可序列化的图像:

public class Contact implements Serializable
{
...
public static final String CONTACT_KEY = "contactKey";
private transient Bitmap mImage;
...
}

我将其传递给 fragment :

Bundle bundle = new Bundle();
final FragmentManager fragmentManager = getFragmentManager();

// Load the fragment
Fragment contactFragment = new ContactFragment();
contactFragment.setArguments(bundle);
fragmentManager.beginTransaction()
.replace(R.id.contactContainer, headerFragment, "ContactFragment")
.commit();

然后拉出镜像(成功)并使用它:

public class ContactFragment extends Fragment
{
private static final String TAG = "ContactFragment";

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
Bundle arguments = getArguments();
if (arguments != null)
{
Contact contact = (Contact) arguments.getSerializable(Contact.CONTACT_KEY);
ViewGroup view = (ViewGroup)inflater.inflate(R.layout.contact, container, false);
if (view != null && contact != null)
{
ImageView imageView = (ImageView) view.findViewById(R.id.contactImage);
if (imageView != null)
{
if (contact.hasImage())
{
imageView.setImageBitmap(contact.image());
}
}
}
}
}
}

但是当我在后台运行我的应用程序时,我收到了来自系统的运行时异常:

Process: my.package, PID: 11680
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = my.package.Contact)
at android.os.Parcel.writeSerializable(Parcel.java:1316)
at android.os.Parcel.writeValue(Parcel.java:1264)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:618)
at android.os.Bundle.writeToParcel(Bundle.java:1692)
at android.os.Parcel.writeBundle(Parcel.java:636)
at android.app.FragmentState.writeToParcel(Fragment.java:132)
at android.os.Parcel.writeTypedArray(Parcel.java:1133)
at android.app.FragmentManagerState.writeToParcel(FragmentManager.java:373)
at android.os.Parcel.writeParcelable(Parcel.java:1285)
at android.os.Parcel.writeValue(Parcel.java:1204)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:618)
at android.os.Bundle.writeToParcel(Bundle.java:1692)
at android.os.Parcel.writeBundle(Parcel.java:636)
at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2467)
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3084)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
Caused by: java.io.NotSerializableException: android.graphics.Bitmap
at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364)
at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
at android.os.Parcel.writeSerializable(Parcel.java:1311)
at android.os.Parcel.writeValue(Parcel.java:1264)
            at android.os.Parcel.writeArrayMapInternal(Parcel.java:618)
            at android.os.Bundle.writeToParcel(Bundle.java:1692)
            at android.os.Parcel.writeBundle(Parcel.java:636)
            at android.app.FragmentState.writeToParcel(Fragment.java:132)
            at android.os.Parcel.writeTypedArray(Parcel.java:1133)
            at android.app.FragmentManagerState.writeToParcel(FragmentManager.java:373)
            at android.os.Parcel.writeParcelable(Parcel.java:1285)
            at android.os.Parcel.writeValue(Parcel.java:1204)
            at android.os.Parcel.writeArrayMapInternal(Parcel.java:618)
            at android.os.Bundle.writeToParcel(Bundle.java:1692)
            at android.os.Parcel.writeBundle(Parcel.java:636)
            at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2467)

大概是因为它试图保留我的 fragment 参数。

我知道我不应该像这样尝试序列化位图,但我的问题是为什么这样做有效? android 是否在进行某种优化?

在这两种情况下,Contact 都是序列化的,这是怎么回事?

最佳答案

引起:java.io.NotSerializableException:android.graphics.Bitmap

好吧,澄清一下位图是不可序列化的,即它们不能被分解并保存到磁盘(硬缓存)。

在第一种情况下,它可能会使用像 Map 这样的软缓存,因此可以将位图保存在内存中。 (软缓存)

当您在后台运行您的应用程序时,系统会尝试将您的数据保存到磁盘,因此它必须序列化这些东西,这就是您遇到崩溃时的情况。

有道理吗?

关于android - 为什么我可以通过 Bundle 传递带有位图的可序列化对象,但在系统尝试对其进行序列化时却出现错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24449473/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com