4
respostas

Unable to marshal value Mensagem

Quando eu minimizo o app no emulador ele dá um crash e aparece esse erro no android studio. Como eu posso resolver esse problema?

 FATAL EXCEPTION: main     Process: br.com.caelmun.ichatalura, PID: 4540
                                                                         java.lang.RuntimeException: Parcel: unable to marshal value br.com.caelmun.ichatalura.modelo.Mensagem@ccc04d7
                                                                             at android.os.Parcel.writeValue(Parcel.java:1477)
                                                                             at android.os.Parcel.writeList(Parcel.java:812)
                                                                             at android.os.Parcel.writeValue(Parcel.java:1424)
                                                                             at android.os.Parcel.writeArrayMapInternal(Parcel.java:724)
                                                                             at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1408)
                                                                             at android.os.Bundle.writeToParcel(Bundle.java:1157)
                                                                             at android.os.Parcel.writeBundle(Parcel.java:764)
                                                                             at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3633)
                                                                             at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3773)
                                                                             at android.os.Handler.handleCallback(Handler.java:751)
                                                                             at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                             at android.os.Looper.loop(Looper.java:154)
                                                                             at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                             at java.lang.reflect.Method.invoke(Native Method)
                                                                             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

public class Mensagem {

    @SerializedName("text")
    private String texto;
    private int id;

    public Mensagem(int id, String texto) {
        this.texto = texto;
        this.id = id;
    }

    public String getText() {
        return texto;
    }

    public void setText(String texto) {
        this.texto = texto;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }


}
4 respostas

Fala ai Rodrigo, tudo bem ?

Não entendi o que pode estar gerando esse erro, pode nos dar mais contexto para podermos ter alguma ideia ?

O erro só ocorre quando você minimiza a aplicação? Já deu uma verificada nas instruções contidas nos métodos "onPause" e "onStop" da activity que está dando erro?

Matheus: Eu to usando genymotion como emulador e fiz as aulas do ichat android.

Fabio: Fiz mais uns testes e ele ocorre quando tem mensagem na lista do app, e só tem o metodo oncreate.

Tem o mainActivity abaixo:


public class MainActivity extends AppCompatActivity {
    private int idDoCliente = new Random().nextInt();
    private List<Mensagem> mensagens;

    @BindView(R.id.lv_mensagem)
    ListView listaDeMensagens;

    @BindView(R.id.et_texto)
    EditText editText;

    @BindView(R.id.btn_enviar)
    Button button;

    @BindView(R.id.iv_avatar_usuario)
    ImageView avatar;

    @Inject
    ChatService chatService;

    @Inject
    EventBus eventBus;

    @Inject
    InputMethodManager inputMethodManager;

    private ChatComponent component;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ButterKnife.bind(this);

        ChatApplication app = (ChatApplication) getApplication();
        component = app.getComponent();
        component.inject(this);

        if (savedInstanceState != null) {
            mensagens = (List<Mensagem>) savedInstanceState.getSerializable("mensagens");
        } else {
            mensagens = new ArrayList<>();
        }

        MensagemAdapter adapter = new MensagemAdapter(idDoCliente, mensagens, this);
        listaDeMensagens.setAdapter(adapter);

        Picasso.with(this)
                .load("https://api.adorable.io/avatars/285/" + idDoCliente + ".png")
                .into(avatar);

        ouvirMensagem(new MensagemEvent());

        eventBus.register(this);

    }




    @Override
    public void onSaveInstanceState(Bundle bundle) {
        super.onSaveInstanceState(bundle);
        bundle.putSerializable("mensagens", (ArrayList<Mensagem>) mensagens);
    }

    @Override
    protected void onStop() {
        super.onStop();

        // deixando claro que não queremos mais ouvir o evento
        eventBus.unregister(this);
    }


    @OnClick(R.id.btn_enviar)
    public void enviarMensagem() {
        chatService.enviar(new Mensagem(idDoCliente, editText.getText().toString())).enqueue(new EnviarMensagemCallback());
        editText.getText().clear();
        inputMethodManager.hideSoftInputFromWindow(editText.getWindowToken(), 0);

    }

    @Subscribe
    public void colocaNaLista(MensagemEvent mensagemEvent) {
        mensagens.add(mensagemEvent.mensagem);
        MensagemAdapter adapter = new MensagemAdapter(idDoCliente, mensagens, this);
        listaDeMensagens.setAdapter(adapter);
    }

    @Subscribe
    public void ouvirMensagem(MensagemEvent mensagemEvent) {
        Call<Mensagem> call = chatService.ouvirMensagens();
        call.enqueue(new OuvirMensagensCallback(eventBus, this));
    }

    @Subscribe
    public void lidarCom(FailureEvent event) {
        ouvirMensagem(null);
    }

}

Para você guardar o valor da mensagem no onSaveInstanceState, a classe Mensagem tem que implementar Serializable.