Ошибка при передаче Parcelable в другое активити

401
13 сентября 2017, 11:55

Задача:

Передать нужные мне данные (сообщения)

Проблема:

Возникает ошибки при передаче через Parcelable.

E/AndroidRuntime: FATAL EXCEPTION: main
                                             Process: com.mobile.exodus.kosmomessanger, PID: 3753
                                             java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mobile.exodus.kosmomessanger/com.mobile.exodus.kosmomessanger.MainActivity}: java.lang.ClassCastException: android.os.Parcelable[] cannot be cast to com.mobile.exodus.kosmomessanger.MessagesObject[]
                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                                                 at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                 at android.os.Handler.dispatchMessage(Handler.java:102)
                                                 at android.os.Looper.loop(Looper.java:148)
                                                 at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                              Caused by: java.lang.ClassCastException: android.os.Parcelable[] cannot be cast to com.mobile.exodus.kosmomessanger.MessagesObject[]
                                                 at com.mobile.exodus.kosmomessanger.MainActivity.onCreate(MainActivity.java:75)
                                                 at android.app.Activity.performCreate(Activity.java:6237)
                                                 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)

Вот код класса Parcelable:

import android.os.Parcel;
import android.os.Parcelable;
class MessagesObject implements Parcelable {
    private String id;
    private String senderId;
    private String recipient;
    private String message;
    private String attachments;
    private String date;
    private String time;
    private String sender_nick;
    private MessagesObject(Parcel in) {
        String[] data = new String[8];
        in.readStringArray(data);
        id = data[0];
        senderId = data[1];
        recipient = data[2];
        message = data[3];
        attachments = data[4];
        date = data[5];
        time = data[6];
        sender_nick = data[7];
    }
    public MessagesObject(String id, String senderId, String recipient, String message, String attachments, String date, String time, String sender_nick){
        this .id = id;
        this .senderId = senderId;
        this .recipient = recipient;
        this .message = message;
        this .attachments = attachments;
        this .date = date;
        this .time = time;
        this .sender_nick = sender_nick;
    }

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }

    public String getSenderId() {
        return senderId;
    }
    public void setSenderId(String senderId) {
        this.senderId = senderId;
    }
    public String getRecipient() {
        return recipient;
    }
    public void setRecipient(String recipient) {
        this.recipient = recipient;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public String getAttachements() {
        return attachments;
    }
    public void setAttachements(String attachments) {
        this.attachments = attachments;
    }
    public String getDate() {
        return date;
    }
    public void setDate(String data) {
        this.date = data;
    }
    public String getTime() {
        return time;
    }
    public void setTime(String time) {
        this.time = time;
    }
    public String getSender_nick() {
        return sender_nick;
    }
    public void setSender_nick(String sender_nick) {
        this.sender_nick = sender_nick;
    }

    @Override
    public int describeContents() {
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int i) {
        dest.writeStringArray(new String[] { id, senderId, recipient, message, attachments, date, time, sender_nick });
    }
    public static final Creator<MessagesObject> CREATOR = new Creator<MessagesObject>() {
        @Override
        public MessagesObject createFromParcel(Parcel in) {
            return new MessagesObject(in);
        }
        @Override
        public MessagesObject[] newArray(int size) {
            return new MessagesObject[size];
        }
    };
    }

Вот здесь я сортирую данные и отправляю в Extras:

 JSONArray message= <...>;
  for(int i = 0, count = messages.length(); i< count; i++)
    {
        try {
            messagesObjects[i] = new MessagesObject(jsonObjects.get(i).getString("id"), jsonObjects.get(i).getString("sender_id"),
                    jsonObjects.get(i).getString("recipient"), jsonObjects.get(i).getString("message"), jsonObjects.get(i).getString("attachments"),
                    jsonObjects.get(i).getString("date"), jsonObjects.get(i).getString("time"), jsonObjects.get(i).getString("sender_nick"));
        }
        catch (JSONException e) {
            e.printStackTrace();
        }
    }
 intent.putExtra("messages", messagesObjects);
    startActivity(intent);

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

Intent intent= getIntent();
    messagesObjects = (MessagesObject[]) intent.getParcelableArrayExtra("messages"); // на этой строке вылезает выше описанная ошибка
    id = intent.getStringExtra("id");

 

Дополнение: Данные (сообщения) приходят с сервера в виде JSONArray, в котором лежат JSONObjects. Я его рассортировываю в массив класса MessagesObjects (класс, который имплементирует Parcelable). Я думаю проблема именно в нем, но найти ее не могу.

Прошу помочь! Заранее спасибо!

READ ALSO
Цикл &ldquo;for&rdquo; Java

Цикл “for” Java

Всем привет, как создать на вот этот код цикл? Я пробовал по такому типу

203
Поиск и замена подстрок &ldquo;[N]&rdquo; и &ldquo;(N)&rdquo; в строке

Поиск и замена подстрок “[N]” и “(N)” в строке

В строке "qwerty [5] uiopp (6) asdf (1) hjkl; [3]" нужно найти и заменить все "[N]" на "RN", а "(N)" на "XN", где N- любая цифраЧерез regex я что-то не осилил, из-за скобок

280
Почему этот код работает, несмотря на эффект type erasure?

Почему этот код работает, несмотря на эффект type erasure?

Известно, что во время рантайма конкретный дженерик-тип неизвестен, тк

234