Передача Parcelable Object, который содержит массив Parcelable Objects - PullRequest
1 голос
/ 12 сентября 2011

Я хотел бы передать объект Parcelable, который содержит массив объектов Parcelable;Моя проблема заключается в том, что, несмотря на запуск второго действия, возвращаемый объект является нулевым.Я называю Activity следующим образом:

i=new Intent(SoNActivity.this,OperationListAct.class);
i.putExtra("1", opSettings);
startActivityForResult(i, CommunicationConfig.getRequestCode(SoNActivity.class));

Объект opSetting является экземпляром класса OperationSetting, который имеет в качестве атрибута массив объектов:

public class OperationSetting implements Parcelable{
    public class OperationInfo implements Parcelable{
            private Operation mOperation;
            private boolean mActive;
            private int mPosition;
            private String mName;
            private String mDescription;


            public OperationInfo(boolean isAct,int pos,String name, String descr,Operation op){
                    mActive=isAct;
                    mPosition =pos;
                    mName=name;
                    mDescription=descr;
                    mActive=true;
                    mOperation=op;
            }

            public Operation getOperation(){return mOperation;}
            public boolean getActive(){return mActive;}
            public int getPosition(){return mPosition;}
            public String getName(){return mName;}
            public String getDescription(){return mDescription;}

            public void setOperation(Operation operation){mOperation=operation;}
            public void setActive(boolean active){mActive=active;}
            public void setPosition(int position){mPosition=position;}
            public void setName(String name){mName=name;}
            public void setDescription(String description){mDescription=description;}

            private String[] getAttList(){
                    String[] atts={"name","description","position","isEnabled","operation"};
                    return atts;
            }



            public int describeContents() {
                    return 0;
            }

            @Override
            public void writeToParcel(Parcel out, int flags) {
                    Bundle bndl=new Bundle();
                    String[] attList=this.getAttList();
                    bndl.putString(attList[0], mName);
                    bndl.putString(attList[1],mDescription);
                    bndl.putInt(attList[2],mPosition);
                    bndl.putBoolean(attList[3], mActive);
                    bndl.putString(attList[4], mOperation.toString());
                    out.writeBundle(bndl);

            }

        public OperationInfo (Parcel in) {
            Bundle bndl = in.readBundle();
            String[] attList=this.getAttList();
            mName=bndl.getString(attList[0]);
            mDescription=bndl.getString(attList[1]);
            mPosition=bndl.getInt(attList[2]);
            mActive=bndl.getBoolean(attList[3]);
            mOperation=Operation.valueOf(bndl.getString(attList[4]));
        }

        public final Parcelable.Creator<OperationInfo> CREATOR = new Parcelable.Creator<OperationInfo>() {
                 public OperationInfo createFromParcel(Parcel in) {
                     return new OperationInfo(in);
                 }

                 public OperationInfo[] newArray(int size) {
                     return new OperationInfo[size];
                 }
        };


    }

    private OperationInfo[] m_settings;



    public OperationSetting (String[] namesOp,String[] descrOp,int[] positions, boolean[] enabled,boolean firstExec){
            Operation[] opList=Operation.values();
            m_settings=new OperationInfo[opList.length];
            for(int i=0;i<opList.length;i++){
                    m_settings[i]=new OperationInfo(enabled[i], positions[i], namesOp[i], descrOp[i], opList[i]);
            }
            if(firstExec){
                    String[] newOrder=namesOp.clone();
                    Arrays.sort(newOrder);
                    this.sort(newOrder);
            }
    }

    @Override
    public int describeContents() {
            return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
            dest.writeParcelableArray(m_settings, flags);
    }

public OperationSetting(Parcel in) {
    m_settings = (OperationInfo[]) in.readParcelableArray(OperationInfo.class.getClassLoader());

}

public static final Parcelable.Creator<OperationSetting> CREATOR= new Parcelable.Creator<OperationSetting>() {
    public OperationSetting createFromParcel(Parcel in) {
            return new OperationSetting(in);
    }

    public OperationSetting[] newArray(int size) {
            return new OperationSetting[size];
    }
};}

Наконец, для возвратаобъект из второго упражнения, которое я написал:

Bundle b=getIntent().getExtras();
            OperationSetting op=b.getParcelable("1");

Второе действие работает нормально, но когда я пытаюсь получить объект, я получаю исключение java.lang.outOfMemory;вылетает по методу OperationSetting (Parcel in).Что с ним не так?

1 Ответ

0 голосов
/ 15 июля 2013

Я не уверен, сработает ли то, что вы пытаетесь, потому что, если ваш класс реализует Parcelable, тогда у него должно быть статическое поле CREATOR, и это невозможно в вашей модели, поскольку внутренние классы не могут иметь статические поля. Как насчет того, чтобы поместить OperationInfo в другой класс и затем попробовать?

Ошибка OutOfMemory может быть связана с рекурсивным вызовом OperatorSettings (in), который вызывает переполнение стека (хихикает!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...