Почему я могу передать serializable с растровым изображением через пакет, но получаю сообщение об ошибке, когда система пытается его сериализовать?

#android #serialization #android-fragments #bitmap #android-bundle

#Android #сериализация #android-фрагменты #растровое изображение #android-пакет

Вопрос:

Итак, у меня есть класс с изображением, которое реализует serializable:

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

Я передаю это фрагменту:

 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 amp;amp; 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)
 

Предположительно, поскольку он пытается сохранить мои аргументы fragments.

Я знаю, что мне не следует пытаться сериализовать такое растровое изображение, но мой вопрос в том, ПОЧЕМУ ЭТО РАБОТАЕТ? Выполняет ли Android какую-то оптимизацию?

В обоих случаях контакт сериализуется, так что же происходит?

Ответ №1:

Caused by: java.io.NotSerializableException: android.graphics.Bitmap

Хорошо, чтобы уточнить, что растровые изображения не сериализуемы, т. Е. Их нельзя разбить и сохранить на диск (жесткий кэш).

В первом случае он будет использовать программный кэш, например, карту, поэтому растровое изображение можно сохранить в памяти. (программный кэш)

Когда вы создаете фоновое приложение, система затем пытается сохранить ваши данные на диск, поэтому ей приходится сериализовать вещи, и вот тогда вы получаете сбой.

Имеет смысл?

Комментарии:

1. Хороший, краткий ответ. Спасибо 🙂

Ответ №2:

Поскольку android.graphics.Bitmap Object реализует Parcelable один:

 private static final String PARAM_BITMAP = "BLUB";

public static MyFragment newInstance(Bitmap bm) {
    MyFragment frg = new MyFragment();
    Bundle bundle = new Bundle();
    bundle.putParcelable(PARAM_BITMAP, bm);
    frg.setArguments(bundle);
    return frg;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bitmap bitmap = getArguments().getParcelable(PARAM_BITMAP);
}
 

У меня все нормально работает 😉

Комментарии:

1. Извините, я думаю, вы неправильно поняли вопрос — я спрашивал, почему serializable работал в одной ситуации, но не в другой