Android — контекст в классе Parcelable

У меня есть следующее в классе, реализующем Parcelable:

private static final long serialVersionUID = 66;
private HashMap<Integer, Bitmap> mBitmaps;
private HashMap<Integer, Drawable> mDrawables;
private Context mContext;

И:

@Override
public void writeToParcel(Parcel dest, int flags) {
    // TODO Auto-generated method stub
    dest.writeValue(mBitmaps);
    dest.writeValue(mDrawables);
    dest.writeValue(mContext);
    dest.writeByte((byte) (mActive ? 0x01 : 0x00));

}

Я получаю сообщение об ошибке:

java.lang.RuntimeException: Parcel: unable to marshal value android.app.Application@4051cfe0
at android.os.Parcel.writeValue(Parcel.java:1132)
at com.example.example.ImageManager.writeToParcel(ImageManager.java:82)


dest.writeValue(mContext); is on line 82.

person user1290717    schedule 11.04.2014    source источник
comment
Большой вопрос: зачем вам нужно писать контекст в посылку??? И небольшой ответ: Контекст не может быть разделен, поэтому вы не можете.   -  person Pankaj Kumar    schedule 11.04.2014
comment
попробуйте прочитать это stackoverflow.com/ вопросы/3818745/   -  person xoxol_89    schedule 11.04.2014
comment
В моем коде у меня есть: BitmapFactory.decodeResource(mContext.getResources(), resource)); Могу ли я изменить это, чтобы мне не приходилось использовать контекст для доступа к getResources()?   -  person user1290717    schedule 11.04.2014


Ответы (3)


Как указано в этом ответе: https://stackoverflow.com/a/6112919/7721253

Вы пытаетесь добавить в посылку несериализуемые объекты. Объекты внутри объектов, которые вы сериализуете, также должны быть сериализуемыми.

person Jalvap    schedule 20.06.2017

Вы пишете в Посылку.

Вы реализовали Parcelable для этого?

Вам необходимо реализовать интерфейс Serializable или Parcelable. В противном случае значение не будет обработано, как предполагает ошибка.

Также,

Классы, реализующие интерфейс Parcelable, также должны иметь статическое поле CREATOR, которое представляет собой объект, реализующий интерфейс Parcelable.Creator.

Проверьте Android Parcelable.

person My God    schedule 11.04.2014
comment
Да, реализует Parcelable в классе для объекта, который я пытаюсь передать. - person user1290717; 11.04.2014

Просто напишите небольшой класс, который содержит ваш контекстный объект следующим образом:

import android.content.Context;

public class ContextHolder {
    public static Context context = null;

    public static void setContext(Context context){
        ContextHolder.context = context;
    }

    public static Context getContext(){
        return context;
    }
}

затем всякий раз, когда вам нужен контекст, вы можете просто вызвать функцию ContextHolder.getContext() из любого места, где вам это нужно.

Ваше здоровье

person Malte87    schedule 08.07.2015
comment
Добавление контекста в статическую переменную — это утечка памяти. - person Maxouille; 10.11.2017