java.lang.ClassCastException: java.lang.String не может быть приведен к при реализации parcelable - PullRequest
0 голосов
/ 04 июня 2018

У меня заканчиваются идеи о том, почему моя реализация parcelable создает исключение ClassCastException.Я хотел бы знать, почему оно вызывает исключение и находит способы его исправить. Пожалуйста, дайте мне знать, если мне все еще не хватает информации, чтобы вы, ребята, помогли мне.

Класс IdModelDTO

public class IdModelDTO implements Parcelable {
private String type;
private String surname;
private String givenName;
private String middleName;
private String birthDate;

protected IdModelDTO(Parcel in) {
    givenName = in.readString();
    middleName = in.readString();
    surname = in.readString();
    birthDate = in.readString();
    type = in.readString();
} 
public static final Creator<IdModelDTO> CREATOR = new Creator<IdModelDTO(){
    @Override
    public IdModelDTO createFromParcel(Parcel in) {
        return new IdModelDTO(in);
    }

    @Override
    public IdModelDTO[] newArray(int size) {
        return new IdModelDTO[size];
    }
};

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(givenName);
    dest.writeString(middleName);
    dest.writeString(surname);
    dest.writeString(birthDate);
    dest.writeString(type);
}

@Override
public String toString() {
    return "IdModelDTO{" + "givenName='" + givenName + '\''
            + ", middleName='" + middleName + '\'' +
            "surname='" + surname + '\'' +
            "birthdate=''" + birthDate + '\'' +
            "type='" + type +  '\'' + '}';
}

Здесь я использую его как связку.Я даже могу зарегистрировать его как связку перед отправкой на следующую операцию:

public void checkMplusRespCodes() {
        // Check if response codes are OK/Created:
        if(governmentIdRespCode == null){
            Log.d(TAG, "Government Id Response code: " + governmentIdRespCode );
        }
        if(saveSelfieResponse == null){
            Log.d(TAG, "saveSelfieResponse: " + saveSelfieResponse);
        }
        else if(governmentIdRespCode != null && saveSelfieResponse != null){
            if(governmentIdRespCode.equals("200") && saveSelfieResponse.equals("200")){
                //Create bundle here, then pass it to view:
                //Bundle idModelBundle = new Bundle();
                //idModelBundle.putParcelable(THISIDMODEL, thisIdModel);
                //viewContract.showNextActivity(idModelBundle);
                Log.d(TAG, " checkMplusRespCodes: " + idModelDTO.toString());
                Bundle idModelBundle = new Bundle();
                idModelBundle.putParcelable(THISIDMODEL, idModelDTO);
                viewContract.showDoneLoading();
                viewContract.showNextActivity(idModelBundle);
            }
        }

Затем, по неконтактности, он вызывает исключение ClassCastException:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test1);
    /* */
    Intent previousIntent = getIntent();
    if(previousIntent.getExtras() != null){
        Bundle previousExtras = previousIntent.getExtras();
        if(previousExtras != null){
            IdModelDTO test = previousIntent.getParcelableExtra(THISIDMODEL);
            if(test != null){
                Log.d(TAG, " asd: " + test.toString());
            }
            /* Retrieve: */
        }
    }else{
        //proceed.
    }

Любая помощь будетвысоко ценится.

РЕДАКТИРОВАТЬ: Это журнал метода, в то время как я установил объект Parcelable в виде пакета:

checkMplusRespCodes: IdModelDTO{givenName='test', middleName='asd'surname='Test'birthdate=''axx'type='asxd'}

Исключение происходит в nextActivity, гдеоно кастуется:

IdModelDTO test = previousIntent.getParcelableExtra(THISIDMODEL);

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Я думаю, что вы пытаетесь проанализировать date объект, который не является String.

Вот почему вы получаете это исключение.

0 голосов
/ 05 июня 2018

Хорошо, я решил это.Я передавал приведение объекта Bundle в свой пользовательский IdModelDTO, как вы можете видеть в этой строке:

if(previousExtras != null){
        IdModelDTO test = previousIntent.getParcelableExtra(THISIDMODEL);
        ...

Я удалил часть Bundle, где я поместил свой объект в пакет, и использовал putExtra для менячтобы иметь возможность извлекать объект как его тип:

Intent nextActivityIntent = new Intent(this, TestActivityX.class);
nextActivityIntent.putExtra(THISIDMODEL,idModelDTO);
Log.d(TAG, " Show next activity: " + idModelDTO.toString());
startActivity(nextActivityIntent);

Затем поиск будет работать над следующим действием:

Intent previousIntent = getIntent();
    if (previousIntent.getExtras() != null) {
        Bundle previousExtras = previousIntent.getExtras();
        if (previousExtras != null) {
            // Retrieve:
            if (previousExtras.containsKey(THISIDMODEL)) {
                // Re-instanciate new user.
                IdModelDTO test = previousExtras.getParcelable(THISIDMODEL);
                Log.d(TAG, " Previous Details:" + test.toString());
            }
        }
    }

Спасибо, ребята, я действительно ценю комментарии.

0 голосов
/ 04 июня 2018

Замените ваш код этим

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test1);
    /* */
    Intent previousIntent = getIntent();
    if(previousIntent.getExtras() != null){
        Bundle previousExtras = previousIntent.getExtras();
        if(previousExtras != null){
            IdModelDTO test = previousExtras.getParcelable(THISIDMODEL);
            if(test != null){
                Log.d(TAG, " asd: " + test.toString());
            }
            /* Retrieve: */
        }
    }else{
        //proceed.
    }
...