質問編集履歴

3 修正

tagoman

tagoman score 59

2016/05/02 06:28  投稿

AndroidのaidlでParcelableのメンバが初期化される
###前提・実現したいこと
Androidのaidlで二つ目のParcelableのデータがnullになる
バインドしたServiceに対してデータを送りたいのですが、postMessageメソッドのふたつ目の引数であるMessageオブジェクトに格納されているメンバー変数のStringのみが初期化(null)が入る事象がまれに起こって困っています。
バインドしたServiceに対してデータを送りたいのですが、postMessageメソッドの二つ目の引数であるMessageオブジェクトに格納されているメンバー変数のStringのみが初期化(null)が入る事象がまれに起こって困っています。
aidlの書き方を変えてみたのですが、ちょっと混乱しています
###試したこと
aidlのonewayのあるなし、引数のinout , in , outを変更して試した。
いずれもうまく機能しない
※謎な挙動?  
そのなかで、第一引数のGroupにin 第二引数のMessageにoutを設定した時にうまく機能したが、十分な検証は得られていない  
###aidl
GroupとMessageはParcelableを継承
```aidl
oneway void postMessage(inout Group group, inout Message message);
```
###Message
GroupとMessageはParcelableを継承
```Java
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を継承
```Java
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(それ以外の端末でも起こる)
  • Android

    9800 questions

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

2 誤字

tagoman

tagoman score 59

2016/05/02 06:06  投稿

AndroidのaidlでParcelableのメンバが初期化される
###前提・実現したいこと
Androidのaidlで二つ目のParcelableのデータがnullになる
バインドしたServiceに対してデータを送りたいのですが、postMessageメソッドのふたつ目の引数であるMessageオブジェクトに格納されているメンバー変数のStringのみが初期化(null)が入る事象がまれに起こって困っています。
aidlの書き方を変えてみたのですが、ちょっと混乱しています
###試したこと
aidlのonewayのあるなし、引数のinout , in , outを変更して試した。
いずれもうまく機能しない
※謎な挙動?
そのなかで、第一引数のGroupにin 第二引数のMessageにoutを設定した時にうまく機能したが、十分な検証は得られていない
###aidl
GroupとMessageはParcelableを継承
```aidl
oneway void postMessage(inout Group group, inout Message message);
```
###Message
GroupとMessageはParcelableを継承
```Java
package com.tuclicks.pozzchat.model;  
 
import android.content.Context;  
import android.database.Cursor;  
import android.os.Parcel;  
import android.os.Parcelable;  
 
import com.google.gson.annotations.SerializedName;  
import com.tuclicks.pozzchat.ApplicationPreference;  
import com.tuclicks.pozzchat.database.DataBase;  
 
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を継承
```Java
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(それ以外の端末でも起こる)
  • Android

    9800 questions

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

1 Groupオブジェクトのコードを追加

tagoman

tagoman score 59

2016/05/02 06:05  投稿

AndroidのaidlでParcelableのメンバが初期化される
###前提・実現したいこと
Androidのaidlで二つ目のParcelableのデータがnullになる
バインドしたServiceに対してデータを送りたいのですが、postMessageメソッドのふたつ目の引数であるMessageオブジェクトに格納されているメンバー変数のStringのみが初期化(null)が入る事象がまれに起こって困っています。
aidlの書き方を変えてみたのですが、ちょっと混乱しています
###試したこと
aidlのonewayのあるなし、引数のinout , in , outを変更して試した。
いずれもうまく機能しない
※謎な挙動?
そのなかで、第一引数のGroupにin 第二引数のMessageにoutを設定した時にうまく機能したが、十分な検証は得られていない
###aidl
GroupとMessageはParcelableを継承
```aidl
oneway void postMessage(inout Group group, inout Message message);
```
###Message
GroupとMessageはParcelableを継承
```Java
package com.tuclicks.pozzchat.model;
import android.content.Context;
import android.database.Cursor;
import android.os.Parcel;
import android.os.Parcelable;
import com.google.gson.annotations.SerializedName;
import com.tuclicks.pozzchat.ApplicationPreference;
import com.tuclicks.pozzchat.database.DataBase;
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を継承
```Java
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(それ以外の端末でも起こる)
  • Android

    9800 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る