0

少年、これは奇妙なものです。

サービスにインテントを送信しています。

public void updatePortfolio(VehiclePortfolio vehiclePortfolio) {
    GenericParcel gp = new GenericParcel(vehiclePortfolio);
    Intent apiIntent = new Intent(context, ApiRequestService.class);
    apiIntent.putExtra(Constants.ARG_REQUEST, Constants.REQUEST_UPDATE_PORTFOLIO);
    apiIntent.putExtra(Constants.ARG_VEHICLE_PORTFOLIO, gp);
    // Try getting object back here
    //gp = apiIntent.getParcelableExtra(Constants.ARG_VEHICLE_PORTFOLIO);
    VehiclePortfolio vp = (VehiclePortfolio)gp.getObject();
    String s = apiIntent.getStringExtra(Constants.ARG_REQUEST);
    vehiclePortfolio = (VehiclePortfolio) gp.getObject();

    // .putExtra(Constants.ARG_VEHICLE_PORTFOLIO, b);
    context.startService(apiIntent);
}

この関数の最後にあるインテントでエクストラを確認すると、以下に示すように問題なく表示されます。

 mMap   HashMap  (id=830037731672)  
[0] HashMap$HashMapEntry  (id=830037731800) 
    key "ARG_VEHICLE_PORTFOLIO" (id=830038543392)   
    value   GenericParcel  (id=830038204888)    
        o   VehiclePortfolio  (id=830038244704) 
            configuration   VehicleConfiguration  (id=830038258216) 
            id  "1375379159508" (id=830038245672)   
            optionals   VehiclePortfolio$_Fields[5]  (id=830038244744)  
            priceReport VehiclePriceReport  (id=830038312960)   
            quotes  ArrayList  (id=830038417704)    
            timestamp   "2013-08-01T17:46:31.000Z" (id=830038536424)    
[1] HashMap$HashMapEntry  (id=830037731768) 
    key "ARG_REQUEST" (id=830037687416) 
    value   Integer  (id=830019251512)  
        value   6   

次に、サービスがインテントを受け取ると、エクストラは次のようになります。vehiclePortfolio が ARG_REQUEST エクストラの上に上書きされ、キーと値が交換されていることに注意してください。(何?!?)

  mMap  HashMap  (id=830038833832)  
[0] HashMap$HashMapEntry  (id=830039001656) 
    key VehiclePortfolio  (id=830038934408) 
        configuration   VehicleConfiguration  (id=830038936272) 
        id  "1375379159508" (id=830038936128)   
        optionals   null    
        priceReport VehiclePriceReport  (id=830038941176)   
        quotes  ArrayList  (id=830038963264)    
        timestamp   "2013-08-01T17:46:31.000Z" (id=830039001424)    
    value   "ARG_REQUEST" (id=830039001576) 
[1] HashMap$HashMapEntry  (id=830038834568) 
    key "ARG_VEHICLE_PORTFOLIO" (id=830038833888)   
    value   GenericParcel  (id=830038834512)    
        o   Parcel  (id=830037350528)   
            mNativePtr  1891558544  
            mOwnsNativeParcelObject true    
            mStack  null    

以下は、犯人であると思われる GenericParcel のコードです。テストを行い、GenericParcel 内の複雑なオブジェクトの代わりに文字列を渡すと、動作は期待どおりです。

public class GenericParcel implements Parcelable {
    private Object o;

    public GenericParcel(Object in) {
        o = in;
    }

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

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeValue(o);
    }

    public Object getObject() {
        return o;
    }

    public static final Creator<GenericParcel> CREATOR = new Creator<GenericParcel>() {

        public GenericParcel createFromParcel(Parcel source) {
            return new GenericParcel(source);
        }

        public GenericParcel[] newArray(int size) {

            return new GenericParcel[size];
        }
    };

}
4

1 に答える 1

1

Parcelableオブジェクトの実装が正しくないと思います。唯一の引数として a Parcel( ではなく) を取るコンストラクタが必要であり、 inに書き込んだのと同じ順序でObjectから値を読み取る必要があります。ParcelParcelwriteToParcel()

public class GenericParcel implements Parcelable {
    private Object o;

    public GenericParcel(Parcel in) {
        o = in.readValue(null);
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeValue(o);
    }

    // the rest removed for brevity
}
于 2013-08-11T17:05:28.623 に答える