1

我在这里搜索了几天寻找解决方案,但我找不到它。我有一个通过活动发送对象的活动。但是,当“readParcelable”开始时,出现几个对象后 CastExceptionError,我调试了几次这段代码,试图替换对象,评论对象,没有任何效果。这里是代码:所有类都实现了 Parcelable、writeToParcel、readFromParcel 和 CREATOR 方法。

@Override
public void onClick(View v) {
       carregaDados();
       Intent myIntent = new Intent(ctx, Activity_VendaProduto.class);
       if (!logradouro.getText().toString().equals("")) {
           cliente.setEndereco(endereco); //nothing important here, just another object
           gerarVenda(); //who populates my "venda object with data"
           myIntent.putExtra("venda", venda);
       }
       startActivity(myIntent); 
    }
});

在这里,这个“Venda”对象的 writeToParcel:

@Override
public void writeToParcel(Parcel dest, int flags) {

    dest.writeString(numeroContrato);
    dest.writeString(numeroProposta);
    dest.writeString(observacaoComplementar);
    dest.writeString(tipoVenda);
    dest.writeString(fidelidade);
    dest.writeString(hash);
    dest.writeString(oferta);

    dest.writeParcelable(visita, flags);
    dest.writeParcelable(midia, flags);
    dest.writeParcelable(tipoContratoVenda, flags);
    dest.writeParcelable(periodoInstalacao, flags);
    dest.writeParcelable(produtoAgrupamento, flags);
    dest.writeParcelable(formaPagamento, flags);
    dest.writeParcelable(vendaInternet, flags);

}

在这个类上,我有一个调用方法的构造函数:“readFromParcel”这里是构造函数:

private Venda(Parcel source) {
    readFromParcel(source);
}

这是 readFromParcel 方法(我检查了几次写入时的项目顺序和此方法)

 private void readFromParcel(Parcel in) {

        numeroContrato = in.readString();
        numeroProposta = in.readString();
        observacaoComplementar = in.readString();
        tipoVenda = in.readString();
        fidelidade = in.readString();
        hash = in.readString();
        oferta = in.readString();

        visita =  in.readParcelable(Visita.class.getClassLoader());
        midia = in.readParcelable(Midia.class.getClassLoader());
        tipoContratoVenda = in.readParcelable(TipoContratoVenda.class.getClassLoader());
        periodoInstalacao = in.readParcelable(Periodo.class.getClassLoader());
        produtoAgrupamento = in.readParcelable(ProdutoAgrupamento.class.getClassLoader());
        formaPagamento = in.readParcelable(FormaPagamento.class.getClassLoader());
        vendaInternet =     in.readParcelable(VendaInternet.class.getClassLoader());
    }

所有这些 readParcelable 方法都属于一个自定义对象,这些对象类也实现了 Parcelable 及其所有方法。

这里 LogCat 错误,发生在这一行:

            periodoInstalacao = in.readParcelable(Periodo.class.getClassLoader());
        produtoAgrupamento = in.readParcelable(ProdutoAgrupamento.class.getClassLoader());

我试图评论,替换,但错误仍然存​​在于相邻的对象上。

日志猫:

12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime  FATAL EXCEPTION: main
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime  java.lang.RuntimeException: Unable to start activity ComponentInfo{projetoTeste/projetoTeste.controle.Activity_VendaProduto}: java.lang.ClassCastException: projetoTeste.dto.Periodo cannot be cast to projetoTeste.dto.ProdutoAgrupamento
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.app.ActivityThread.access$600(ActivityThread.java:123)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.os.Handler.dispatchMessage(Handler.java:99)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.os.Looper.loop(Looper.java:137)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.app.ActivityThread.main(ActivityThread.java:4424)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at java.lang.reflect.Method.invokeNative(Native Method)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at java.lang.reflect.Method.invoke(Method.java:511)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at dalvik.system.NativeStart.main(Native Method)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime  Caused by: java.lang.ClassCastException: projetoTeste.dto.Periodo cannot be cast to projetoTeste.dto.ProdutoAgrupamento
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at projetoTeste.dto.Venda.readFromParcel(Venda.java:343)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at projetoTeste.dto.Venda.<init>(Venda.java:69)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at projetoTeste.dto.Venda.<init>(Venda.java:12)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at projetoTeste.dto.Venda$1.createFromParcel(Venda.java:349)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at projetoTeste.dto.Venda$1.createFromParcel(Venda.java:347)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.os.Parcel.readParcelable(Parcel.java:1992)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.os.Parcel.readValue(Parcel.java:1854)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.os.Parcel.readMapInternal(Parcel.java:2094)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.os.Bundle.unparcel(Bundle.java:223)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.os.Bundle.getParcelable(Bundle.java:1158)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at projetoTeste.controle.Activity_VendaProduto.onCreate(Activity_VendaProduto.java:79)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.app.Activity.performCreate(Activity.java:4465)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
12:20:22.493    526 projetoTeste    ERROR   AndroidRuntime      ... 11 more

所以,我来这里乞求一个光明,我尝试了又尝试,但看不到这个错误仍然发生的位置和原因。

提前致谢!

- - 更新 - -

解决了,我按照答案的步骤,修复了列表和数组上的一些转换/写入/读取,现在一切看起来都很好!谢谢!

4

1 回答 1

3

只是为了正确的代码样式,将泛型类型添加到 CREATOR 到所有 Parcelable 对象。对于 Periodo,它应该是

public static final Parcelable.Creator<Periodo> CREATOR = new Parcelable.Creator<Periodo>() {

你不需要做

if(tipoProdutoLista != null){
    for(int i=0; i < tipoProdutoLista.length;++i){
        parcelableTipoProduto[i] = (Parcelable) tipoProdutoLista[i];
    }
    dest.writeParcelableArray(parcelableTipoProduto, flags);
}

只需按原样传递tipoProdutoLista,它已经是Parcelable,并删除标志。

dest.writeParcelableArray(tipoProdutoLista, 0);

错误是,在写入 Parcelable 时,您不能添加与 writeToParcel 参数相同的标志。

用零调用 writeParcelable 时替换标志

曾是

dest.writeParcelable(visita, flags);

应该

dest.writeParcelable(visita, 0);

在您有writeParcelable调用的所有地方替换它。

于 2013-05-28T13:13:23.833 回答