[android-developers] Re: Remote Interface - Parcelables problem...

2009-09-23 Thread Ne0

Has anyone had experience with passing a pacelable class through an
aidl interface?

Just cant get it to work the way they describe here
http://developer.android.com/guide/developing/tools/aidl.html#implementtheinterface

cheers,

Liam

On Sep 23, 10:59 am, Ne0  wrote:
> Been using remote interfaces for quite a while now, but the time has
> come to increase the amount of data i need to pass between processes.
> Following the Designing a Remote Interface using aidl examples/
> tutorial i have had some success but have now come to a problem.
>
> My activity binds to my service no problem, the callbacks work, but
> the data i send does not reach the client. My code is an extension of
> "Pass by value Parameters using Parcelables" from the  "Designing a
> Remote Interface using aidl" page. The only difference is the amount
> of data, it has 18 int's and 3 Doubles. As you will see below, once i
> have entered the data into the parcel, i create my Parcelable
> using .createFromParcel(p) this however does not seem to work, even
> when my Parcelable is reading from the parcel no data gets read.
>
> Here is my code for sending the data to the client.
>
> /*
>      * Send the latest info to the bound apps
>  */
>     private void updateBoundApps(){
>
>         if(mCallbacks.beginBroadcast() > 0){
>                 if(gLOG){Log.d(TAG,"updateBoundApps " + mSMNI.int1);} // 
> Always
> shows int1 as corret value (non 0)
>
>                 Parcel p = Parcel.obtain();
>                 p.writeInt(mSMNI.int1);
>                 p.writeInt(mSMNI.int2);
>                 p.writeInt(mSMNI.int3);
>                 p.writeInt(mSMNI.int4);
>                 p.writeInt(mSMNI.int5);
>                 p.writeInt(mSMNI.int6);
>
>                 Iterator> itNew = mSMNI.intMap.entrySet
> ().iterator();
>                 for(int i = 0 ; i < 6; i++){
>                         if(itNew.hasNext()){
>                                 Map.Entry eNew = itNew.next();
>                                 p.writeInt((Integer) eNew.getKey());
>                                 p.writeInt((Integer) eNew.getValue());
>                         }else{
>                                 p.writeInt(0);
>                                 p.writeInt(0);
>                         }
>                 }
>                 p.writeDouble(mLastLoc.Double1);
>                 p.writeDouble(mLastLoc.Double2);
>                 p.writeDouble(mLastLoc.Double3);
>
>             MPSData mpsd = MPSData.CREATOR.createFromParcel(p);
>             // Send the message
>             Message msg = mHandler.obtainMessage(REPORT_MSG, mpsd);
>             mHandler.sendMessageDelayed(msg, 1*1000);
>             p.recycle();
>         }
>         mCallbacks.finishBroadcast();
>     }
>
> Here is my Parecelable:
>
> public class MPSData implements Parcelable{
>
>         public int int1;
>         public int int2;
>         public int int3;
>         public int int4;
>         public int int5;
>         public int int6;
>         public int int7;
>         public int int8;
>         public int int9;
>         public int int10;
>         public int int11;
>         public int int12;
>         public int int13;
>         public int int14;
>         public int int15;
>         public int int16;
>         public int int17;
>         public int int18;
>         public double double1;
>         public double double2;
>         public double double3;
>
>         public static final Parcelable.Creator CREATOR = new
> Parcelable.Creator() {
>                 @Override
>         public MPSData createFromParcel(Parcel in) {
>                         Log.d("MPSData","createFromParcel dataAvail " + 
> in.dataAvail() + "
> dataSize " + in.dataSize());
>             return new MPSData(in);
>         }
>
>         public MPSData[] newArray(int size) {
>             return new MPSData[size];
>         }
>     };
>
>     public MPSData(){
>
>     }
>
>         private MPSData(Parcel in){
>                 Log.d("MPSData","MPSData(Parcel in)");
>                 readFromParcel(in);
>         }
>
>         @Override
>         public int describeContents() {
>                 // TODO Auto-generated method stub
>                 return 0;
>         }
>
>         public void writeToParcel(Parcel out) {
>                 out.writeInt(int1);
>                 out.writeInt(int2);
>                 out.writeInt(int3);
>                 out.writeInt(int4);
>                 out.writeInt(int5);
>                 out.writeInt(int6);
>                 out.writeInt(int7);
>                 out.writeInt(int8);
>                 out.writeInt(int9);
>                 out.writeInt(int10);
>                 out.writeInt(int11);
>                 out.writeInt(int12);
>                 out.writeInt(int13);
>                 out.writeInt(int14);
>                 out.writeInt(int15);
>                 out.writeInt(int16);
>                 out.writeInt(int17);
>                 out.writeInt(int18);
>                 out.w

[android-developers] Re: Remote Interface - Parcelables problem...

2009-09-23 Thread Robert Green

Yes, I have done plenty of this now.  Here's how I do it:

My Parcelable is called an OnlineUser.  Here's the important stuff:

private OnlineUser(Parcel in) {
readFromParcel(in);
}

public void writeToParcel(Parcel out, int arg1) {
writeToParcel(out);
}

public void writeToParcel(Parcel out) {
out.writeInt(id);
out.writeString(userName);
out.writeString(dictionary);
out.writeInt(allowRandomGames ? 1 : 0);
}

public void readFromParcel(Parcel in) {
id = in.readInt();
userName = in.readString();
dictionary = in.readString();
allowRandomGames = in.readInt() == 1;
}

public int describeContents() {
return 0;
}

public static final Parcelable.Creator CREATOR = new
Parcelable.Creator() {
public OnlineUser createFromParcel(Parcel in) {
return new OnlineUser(in);
}

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


On Sep 23, 9:52 am, Ne0  wrote:
> Has anyone had experience with passing a pacelable class through an
> aidl interface?
>
> Just cant get it to work the way they describe 
> herehttp://developer.android.com/guide/developing/tools/aidl.html#impleme...
>
> cheers,
>
> Liam
>
> On Sep 23, 10:59 am, Ne0  wrote:
>
> > Been using remote interfaces for quite a while now, but the time has
> > come to increase the amount of data i need to pass between processes.
> > Following the Designing a Remote Interface using aidl examples/
> > tutorial i have had some success but have now come to a problem.
>
> > My activity binds to my service no problem, the callbacks work, but
> > the data i send does not reach the client. My code is an extension of
> > "Pass by value Parameters using Parcelables" from the  "Designing a
> > Remote Interface using aidl" page. The only difference is the amount
> > of data, it has 18 int's and 3 Doubles. As you will see below, once i
> > have entered the data into the parcel, i create my Parcelable
> > using .createFromParcel(p) this however does not seem to work, even
> > when my Parcelable is reading from the parcel no data gets read.
>
> > Here is my code for sending the data to the client.
>
> > /*
> >      * Send the latest info to the bound apps
> >  */
> >     private void updateBoundApps(){
>
> >         if(mCallbacks.beginBroadcast() > 0){
> >                 if(gLOG){Log.d(TAG,"updateBoundApps " + mSMNI.int1);} // 
> > Always
> > shows int1 as corret value (non 0)
>
> >                 Parcel p = Parcel.obtain();
> >                 p.writeInt(mSMNI.int1);
> >                 p.writeInt(mSMNI.int2);
> >                 p.writeInt(mSMNI.int3);
> >                 p.writeInt(mSMNI.int4);
> >                 p.writeInt(mSMNI.int5);
> >                 p.writeInt(mSMNI.int6);
>
> >                 Iterator> itNew = 
> > mSMNI.intMap.entrySet
> > ().iterator();
> >                 for(int i = 0 ; i < 6; i++){
> >                         if(itNew.hasNext()){
> >                                 Map.Entry eNew = 
> > itNew.next();
> >                                 p.writeInt((Integer) eNew.getKey());
> >                                 p.writeInt((Integer) eNew.getValue());
> >                         }else{
> >                                 p.writeInt(0);
> >                                 p.writeInt(0);
> >                         }
> >                 }
> >                 p.writeDouble(mLastLoc.Double1);
> >                 p.writeDouble(mLastLoc.Double2);
> >                 p.writeDouble(mLastLoc.Double3);
>
> >             MPSData mpsd = MPSData.CREATOR.createFromParcel(p);
> >             // Send the message
> >             Message msg = mHandler.obtainMessage(REPORT_MSG, mpsd);
> >             mHandler.sendMessageDelayed(msg, 1*1000);
> >             p.recycle();
> >         }
> >         mCallbacks.finishBroadcast();
> >     }
>
> > Here is my Parecelable:
>
> > public class MPSData implements Parcelable{
>
> >         public int int1;
> >         public int int2;
> >         public int int3;
> >         public int int4;
> >         public int int5;
> >         public int int6;
> >         public int int7;
> >         public int int8;
> >         public int int9;
> >         public int int10;
> >         public int int11;
> >         public int int12;
> >         public int int13;
> >         public int int14;
> >         public int int15;
> >         public int int16;
> >         public int int17;
> >         public int int18;
> >         public double double1;
> >         public double double2;
> >         public double double3;
>
> >         public static final Parcelable.Creator CREATOR = new
> > Parcelable.Creator() {
> >                 @Override
> >         pub

[android-developers] Re: Remote Interface - Parcelables problem...

2009-09-24 Thread Ne0

Thanks, though it doesnt look like you are doing anything different to
i am. When you initialise an instance of your OnlineUser, would you do
it using OnlineUser.CREATOR.createFromParcel(p), after packing your
parcel?

If you can see a problem with my code in my original post, please
advise? The issue is the parcel gets packed with non-zero integers,
but when readFromParcel gets called only 0 integers get read out.

Liam

On Sep 23, 5:14 pm, Robert Green  wrote:
> Yes, I have done plenty of this now.  Here's how I do it:
>
> My Parcelable is called an OnlineUser.  Here's the important stuff:
>
>         private OnlineUser(Parcel in) {
>                 readFromParcel(in);
>         }
>
>         public void writeToParcel(Parcel out, int arg1) {
>                 writeToParcel(out);
>         }
>
>         public void writeToParcel(Parcel out) {
>                 out.writeInt(id);
>                 out.writeString(userName);
>                 out.writeString(dictionary);
>                 out.writeInt(allowRandomGames ? 1 : 0);
>         }
>
>         public void readFromParcel(Parcel in) {
>                 id = in.readInt();
>                 userName = in.readString();
>                 dictionary = in.readString();
>                 allowRandomGames = in.readInt() == 1;
>         }
>
>         public int describeContents() {
>                 return 0;
>         }
>
>         public static final Parcelable.Creator CREATOR = new
> Parcelable.Creator() {
>                 public OnlineUser createFromParcel(Parcel in) {
>                         return new OnlineUser(in);
>                 }
>
>                 public OnlineUser[] newArray(int size) {
>                         return new OnlineUser[size];
>                 }
>         };
>
> On Sep 23, 9:52 am, Ne0  wrote:
>
> > Has anyone had experience with passing a pacelable class through an
> > aidl interface?
>
> > Just cant get it to work the way they describe 
> > herehttp://developer.android.com/guide/developing/tools/aidl.html#impleme...
>
> > cheers,
>
> > Liam
>
> > On Sep 23, 10:59 am, Ne0  wrote:
>
> > > Been using remote interfaces for quite a while now, but the time has
> > > come to increase the amount of data i need to pass between processes.
> > > Following the Designing a Remote Interface using aidl examples/
> > > tutorial i have had some success but have now come to a problem.
>
> > > My activity binds to my service no problem, the callbacks work, but
> > > the data i send does not reach the client. My code is an extension of
> > > "Pass by value Parameters using Parcelables" from the  "Designing a
> > > Remote Interface using aidl" page. The only difference is the amount
> > > of data, it has 18 int's and 3 Doubles. As you will see below, once i
> > > have entered the data into the parcel, i create my Parcelable
> > > using .createFromParcel(p) this however does not seem to work, even
> > > when my Parcelable is reading from the parcel no data gets read.
>
> > > Here is my code for sending the data to the client.
>
> > > /*
> > >      * Send the latest info to the bound apps
> > >  */
> > >     private void updateBoundApps(){
>
> > >         if(mCallbacks.beginBroadcast() > 0){
> > >                 if(gLOG){Log.d(TAG,"updateBoundApps " + mSMNI.int1);} // 
> > > Always
> > > shows int1 as corret value (non 0)
>
> > >                 Parcel p = Parcel.obtain();
> > >                 p.writeInt(mSMNI.int1);
> > >                 p.writeInt(mSMNI.int2);
> > >                 p.writeInt(mSMNI.int3);
> > >                 p.writeInt(mSMNI.int4);
> > >                 p.writeInt(mSMNI.int5);
> > >                 p.writeInt(mSMNI.int6);
>
> > >                 Iterator> itNew = 
> > > mSMNI.intMap.entrySet
> > > ().iterator();
> > >                 for(int i = 0 ; i < 6; i++){
> > >                         if(itNew.hasNext()){
> > >                                 Map.Entry eNew = 
> > > itNew.next();
> > >                                 p.writeInt((Integer) eNew.getKey());
> > >                                 p.writeInt((Integer) eNew.getValue());
> > >                         }else{
> > >                                 p.writeInt(0);
> > >                                 p.writeInt(0);
> > >                         }
> > >                 }
> > >                 p.writeDouble(mLastLoc.Double1);
> > >                 p.writeDouble(mLastLoc.Double2);
> > >                 p.writeDouble(mLastLoc.Double3);
>
> > >             MPSData mpsd = MPSData.CREATOR.createFromParcel(p);
> > >             // Send the message
> > >             Message msg = mHandler.obtainMessage(REPORT_MSG, mpsd);
> > >             mHandler.sendMessageDelayed(msg, 1*1000);
> > >             p.recycle();
> > >         }
> > >         mCallbacks.finishBroadcast();
> > >     }
>
> > > Here is my Parecelable:
>
> > > public class MPSData implements Parcelable{
>
> > >         public int int1;
> > >         public int int2;
> > >         public int int3;
> > >         p