質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • Android

    6633questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

AndroidのaidlでParcelableのメンバが初期化される

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 970

tagoman

score 51

前提・実現したいこと

Androidのaidlで二つ目のParcelableのデータがnullになる

バインドしたServiceに対してデータを送りたいのですが、postMessageメソッドの二つ目の引数であるMessageオブジェクトに格納されているメンバー変数のStringのみが初期化(null)が入る事象がまれに起こって困っています。
aidlの書き方を変えてみたのですが、ちょっと混乱しています

試したこと

aidlのonewayのあるなし、引数のinout , in , outを変更して試した。
いずれもうまく機能しない

aidl

GroupとMessageはParcelableを継承

oneway void postMessage(inout Group group, inout Message message);

Message

GroupとMessageはParcelableを継承

public class Message implements Parcelable, Cloneable {

    public Message() {
    }

    @Override
    public Message clone() {
        try {
            return (Message) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }

    @SerializedName("id")
    private long messageId;
    @SerializedName("personId")
    private String fromPersonId;
    private String userName;
    @SerializedName("iconUrl")
    private String userImage;
    @SerializedName("message")
    private String messageText;
    private String messageImage;
    private String messageAudio;
    private String messageVideo;
    @SerializedName("to")
    private String toPersonId;
    private String toPersonIcon;
    private String toPersonName;
    @SerializedName("postDate")
    private long publishDate;
    private long receiveDate;

///省略Getter And Setter

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeLong(this.messageId);
        dest.writeString(this.fromPersonId);
        dest.writeString(this.userName);
        dest.writeString(this.userImage);
        dest.writeString(this.messageText);
        dest.writeString(this.messageImage);
        dest.writeString(this.messageAudio);
        dest.writeString(this.messageVideo);
        dest.writeLong(this.publishDate);
        dest.writeLong(this.receiveDate);
        dest.writeString(this.toPersonId);
        dest.writeString(this.toPersonIcon);
        dest.writeString(this.toPersonName);
    }

    public void readFromParcel(Parcel in) {
        this.messageId = in.readLong();
        this.fromPersonId = in.readString();
        this.userName = in.readString();
        this.userImage = in.readString();
        this.messageText = in.readString();
        this.messageImage = in.readString();
        this.messageAudio = in.readString();
        this.messageVideo = in.readString();
        this.publishDate = in.readLong();
        this.receiveDate = in.readLong();
        this.toPersonId = in.readString();
        this.toPersonIcon = in.readString();
        this.toPersonName = in.readString();
    }


    protected Message(Parcel in) {
        readFromParcel(in);
    }

    public static final Parcelable.Creator<Message> CREATOR = new Parcelable.Creator<Message>() {
        public Message createFromParcel(Parcel source) {
            return new Message(source);
        }

        public Message[] newArray(int size) {
            return new Message[size];
        }
    };


}

Group

GroupとMessageはParcelableを継承

public class Group implements Parcelable, Cloneable {

    public Group() {
    }

    @Override
    public Group clone() {
        try {
            return (Group) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }

    private long groupId;
    @SerializedName("name")
    private String groupName;
    private String description;
    private String iconUrl;
    private boolean isOwner;
    @SerializedName("owner")
    private String ownerPersonId;
    private String ownerUserName;
    private boolean allowDirectMessage;
    @SerializedName("displayUserName")
    private boolean allowDisplayUserName;
    @SerializedName("messageFilter")
    private boolean allowMessageFilter;
    @SerializedName("forcePhont")
    private String fixedPhont;
    @SerializedName("scope")
    private int publicStatus;
    @SerializedName("type")
    private int joinStatus;
    private long joinTime;
    @SerializedName("limit")
    private int joinLimitNumber;
    private long updateTime;
    private int memberCount;
    private int status;

///省略Getter And Setter

    public void readFromParcel(Parcel in) {
        this.groupId = in.readLong();
        this.groupName = in.readString();
        this.description = in.readString();
        this.iconUrl = in.readString();
        this.isOwner = in.readByte() != 0;
        this.ownerPersonId = in.readString();
        this.ownerUserName = in.readString();
        this.allowDirectMessage = in.readByte() != 0;
        this.allowDisplayUserName = in.readByte() != 0;
        this.allowMessageFilter = in.readByte() != 0;
        this.fixedPhont = in.readString();
        this.publicStatus = in.readInt();
        this.joinStatus = in.readInt();
        this.joinTime = in.readLong();
        this.joinLimitNumber = in.readInt();
        this.updateTime = in.readLong();
        this.memberCount = in.readInt();
        this.status = in.readInt();
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeLong(this.groupId);
        dest.writeString(this.groupName);
        dest.writeString(this.description);
        dest.writeString(this.iconUrl);
        dest.writeByte(this.isOwner ? (byte) 1 : (byte) 0);
        dest.writeString(this.ownerPersonId);
        dest.writeString(this.ownerUserName);
        dest.writeByte(this.allowDirectMessage ? (byte) 1 : (byte) 0);
        dest.writeByte(this.allowDisplayUserName ? (byte) 1 : (byte) 0);
        dest.writeByte(this.allowMessageFilter ? (byte) 1 : (byte) 0);
        dest.writeString(this.fixedPhont);
        dest.writeInt(this.publicStatus);
        dest.writeInt(this.joinStatus);
        dest.writeLong(this.joinTime);
        dest.writeInt(this.joinLimitNumber);
        dest.writeLong(this.updateTime);
        dest.writeInt(this.memberCount);
        dest.writeInt(this.status);
    }

    protected Group(Parcel in) {
        this.groupId = in.readLong();
        this.groupName = in.readString();
        this.description = in.readString();
        this.iconUrl = in.readString();
        this.isOwner = in.readByte() != 0;
        this.ownerPersonId = in.readString();
        this.ownerUserName = in.readString();
        this.allowDirectMessage = in.readByte() != 0;
        this.allowDisplayUserName = in.readByte() != 0;
        this.allowMessageFilter = in.readByte() != 0;
        this.fixedPhont = in.readString();
        this.publicStatus = in.readInt();
        this.joinStatus = in.readInt();
        this.joinTime = in.readLong();
        this.joinLimitNumber = in.readInt();
        this.updateTime = in.readLong();
        this.memberCount = in.readInt();
        this.status = in.readInt();
    }

    public static final Creator<Group> CREATOR = new Creator<Group>() {
        @Override
        public Group createFromParcel(Parcel source) {
            return new Group(source);
        }

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

補足情報(言語/FW/ツール等のバージョンなど)

Android Studio 2.1
buildToolsVersion 23.0.3
Android 4.2.2(それ以外の端末でも起こる)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

関連した質問

同じタグがついた質問を見る

  • Android

    6633questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。