2013-05-28 3 views
1

Ив искали здесь поиски решения, но я не могу его найти. У меня есть активность, кто отправляет объект через действия. Но, когда начинается «readParcelable», после нескольких объектов появляется CastExceptionError, Ive отлаживает несколько раз этот код, пытается заменить объекты, объекты комментариев, ничего не работает. Здесь код: Все классы реализуют методы Parcelable, writeToParcel, readFromParcel и CREATOR.ClassCastException - Исходные объекты/Пользовательский объект

@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); 
    } 
}); 

И здесь, то 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 (ive проверен несколько раз на порядок элементов при записи и этот метод)

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

Ive попытался прокомментировать, заменить, но ошибка повторяется на соседних объектах.

Logcat:

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 

Итак, я пришел сюда, чтобы просить свет, ив пытался и пытался и не может видеть, где и почему эта ошибка возникает.

Заранее благодарен!

--- UPDATE ---

решаемые, ив следовали этапы ответа, исправлены некоторые преобразования/записи/чтения в списках и массивах и Everythings выглядит отлично работает сейчас! Спасибо!

+0

Попробуйте заменить все аргументы getClassLoader() равными нулю, например. tipoContratoVenda = in.readParcelable (null); для всех Parcelable объектов. –

+0

Каков тип периодовInstalacao и produtoAgrupamento? – mromer

+0

produtoAgrupamento - объект ProdutoAgrupamento и periodoInstalacao a Periodo class (оба реализуют Parcelable и методы, но внутри класса ProdutoAgrupamento у меня есть: «частный ProdutoTipo [] tipoProdutoLista;» этот список, не знаю, является ли этот парень причиной этой ошибки, я не знаю думаю, так, потому что даже когда я комментирую produtoAgrupamento, ошибка заливки по-прежнему происходит с объектом-соседкой по методу чтения. – krustbr

ответ

2

Для правильного стиля кода добавьте общие типы в 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); 

Ошибка в том, что вы не должны добавить один и тот же флаг, который вы получили в качестве аргумента writeToParcel при написании Parcelable.

Заменить флаги при вызове writeParcelable с нулевым

Был

dest.writeParcelable(visita, flags); 

Должно быть

dest.writeParcelable(visita, 0); 

Заменить его в все места, где у вас есть writeParcelable вызов.

+0

Я делаю изменения, но я использовал это для списка, потому что, когда я пытаюсь использовать writeParcelableArray, я получаю: 'code' метод writeParcelableArray в классе Parcel не может применяться к заданным типам; требуется: T [], Int найдено: Список , Int причины: нет экземпляра (ов) переменного типа (ов) Т существует, так что список аргумента типа соответствует типу формальному параметру Т [] , где Т представляет собой type-variable: T extends Parcelable, объявленный в методе writeParcelableArray (T [], int) ' – krustbr

+0

А также не может набрасываться: produtoList = in.readParcelableArray (Produto.class.getClassLoader()); Причина найденного Parcelable [] вместо Produto [] и литье с (Produto) не работало. – krustbr

+0

Ive изменил все классы для типов generics на CREATOR и изменил флаги на 0 на writeParcelable методы. (Прокомментировал причину ошибки при отправке по предыдущему комментарию) Одинаковые строки/ошибки: 'java.lang.RuntimeException: Не удалось запустить активность ComponentInfo {projetoTeste/projetoTeste.controle.Activity_VendaProduto}: java.lang.ClassCastException: projetoTeste.dto.Periodo не может быть отброшен в projetoTeste.dto.ProdutoAgrupamento Вызвано: java.lang.ClassCastException: projetoTeste.dto.Periodo нельзя отдать на projetoTeste.dto.ProdutoAgrupamento' – krustbr