Autore Topic: Problema passaggio oggetti a servizio remoto  (Letto 1407 volte)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Problema passaggio oggetti a servizio remoto
« il: 19 Ottobre 2010, 17:24:05 CEST »
0
Ho scritto un servizio remoto a cui vari client possono accedere con i meccanismi soliti di ipc messi a disposizione da Android e il binding sembrerebbe funzionare. Il problema nasce quando vado a chiamare un metodo a cui devo passare un oggetto come parametro perchè ottengo questa "curiosa" eccezione:

Codice: [Seleziona]
10-19 15:09:04.601: ERROR/AndroidRuntime(2985): FATAL EXCEPTION: main
10-19 15:09:04.601: ERROR/AndroidRuntime(2985): java.lang.NullPointerException
10-19 15:09:04.601: ERROR/AndroidRuntime(2985):     at android.os.Parcel.readException(Parcel.java:1253)
10-19 15:09:04.601: ERROR/AndroidRuntime(2985):     at android.os.Parcel.readException(Parcel.java:1235)
10-19 15:09:04.601: ERROR/AndroidRuntime(2985):     at it.domod.commons.interfaces.DeviceManager$Stub$Proxy.sendCommand(DeviceManager.java:121)
10-19 15:09:04.601: ERROR/AndroidRuntime(2985):     at it.domod.client.test.ConnectionServerTest$1.onClick(ConnectionServerTest.java:53)
10-19 15:09:04.601: ERROR/AndroidRuntime(2985):     at android.view.View.performClick(View.java:2408)
10-19 15:09:04.601: ERROR/AndroidRuntime(2985):     at android.view.View$PerformClick.run(View.java:8816)
10-19 15:09:04.601: ERROR/AndroidRuntime(2985):     at android.os.Handler.handleCallback(Handler.java:587)
10-19 15:09:04.601: ERROR/AndroidRuntime(2985):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-19 15:09:04.601: ERROR/AndroidRuntime(2985):     at android.os.Looper.loop(Looper.java:123)
10-19 15:09:04.601: ERROR/AndroidRuntime(2985):     at android.app.ActivityThread.main(ActivityThread.java:4627)
10-19 15:09:04.601: ERROR/AndroidRuntime(2985):     at java.lang.reflect.Method.invokeNative(Native Method)
10-19 15:09:04.601: ERROR/AndroidRuntime(2985):     at java.lang.reflect.Method.invoke(Method.java:521)
10-19 15:09:04.601: ERROR/AndroidRuntime(2985):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
10-19 15:09:04.601: ERROR/AndroidRuntime(2985):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
10-19 15:09:04.601: ERROR/AndroidRuntime(2985):     at dalvik.system.NativeStart.main(Native Method)

che a quanto pare viene lanciata da una parte di codice che viene generata a partire dal file .aidl, che è il seguente:

Codice (Java): [Seleziona]
public void sendCommand(it.domod.commons.structures.Command command) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();

try {
_data.writeInterfaceToken(DESCRIPTOR);
if ((command!=null)) {
_data.writeInt(1);
command.writeToParcel(_data, 0);
}
else {
_data.writeInt(0);
}
mRemote.transact(Stub.TRANSACTION_sendCommand, _data, _reply, 0);
_reply.readException(); //riga 121, dove viene tirata l'eccezione
}
finally {
_reply.recycle();
_data.recycle();
}
}

La cosa ancora più strana è che effettivamente il servizio riceve l'oggetto che gli viene passato ma evidentemente c'è qualcosa che non va.
Idee o pareri?


Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Problema passaggio oggetti a servizio remoto
« Risposta #1 il: 20 Ottobre 2010, 12:16:55 CEST »
0
Aggiorno il problema.
Ho fatto diverse prove e sembra che sia proprio la classe che cerco di passare a dare problemi. Posto il codice:
Codice (Java): [Seleziona]
package it.domod.commons.structures;

import android.os.Parcel;
import android.os.Parcelable;

public class Command implements Parcelable {

    public static final int DEVICE_SET_CONFIG = 0;

    public static final int DEVICE_RESET = 1;

    public static final int LOAD_SYSTEM_STATUS = 2;

    public static final int LOAD_SYSTEM_CONFIG = 3;

    public static final int ACK = 4;

    public static final int NACK = 5;

    private String deviceId = "";

    private String propertyName = "";

    private String propertyValue = "";

    private int type = 0;

    private int sequenceNumber;

    private int responseSequenceNumber;

    public Command() {
    }

    public static Command createForDevicePropertyConfiguration(final String deviceId,
            final String propertyName, final float propertyValue) {
        final Command c = new Command();
        c.setDeviceId(deviceId);
        c.setPropertyName(propertyName);
        c.setPropertyValue(String.valueOf(propertyValue));
        c.setType(DEVICE_SET_CONFIG);
        return c;
    }

    public static Command createForDevicePropertyConfiguration(final String deviceId,
            final String propertyName, final int propertyValue) {
        final Command c = new Command();
        c.setDeviceId(deviceId);
        c.setPropertyName(propertyName);
        c.setPropertyValue(String.valueOf(propertyValue));
        c.setType(DEVICE_SET_CONFIG);
        return c;
    }

    public static Command createForResetDevice(String deviceId) {
        final Command c = new Command();
        c.setType(DEVICE_RESET);
        c.setDeviceId(deviceId);
        return c;
    }

    public static Command createForSystemConfigRequest() {
        final Command c = new Command();
        c.setType(LOAD_SYSTEM_CONFIG);
        return c;
    }

    public static Command createForSystemStatusRequest() {
        final Command c = new Command();
        c.setType(LOAD_SYSTEM_STATUS);
        return c;
    }

    public String getDeviceId() {
        return deviceId;
    }

    public String getPropertyName() {
        return propertyName;
    }

    public String getPropertyValue() {
        return propertyValue;
    }

    public void setDeviceId(final String deviceId) {
        this.deviceId = deviceId;
    }

    public void setPropertyName(final String propertyName) {
        this.propertyName = propertyName;
    }

    public void setPropertyValue(final String propertyValue) {
        this.propertyValue = propertyValue;
    }

    public void setType(int type) {
        this.type = type;
    }

    public int getType() {
        return type;
    }

    public void setSequenceNumber(int sequenceNumber) {
        this.sequenceNumber = sequenceNumber;
    }

    public int getSequenceNumber() {
        return sequenceNumber;
    }

    public void setResponseSequenceNumber(int responseSequenceNumber) {
        this.responseSequenceNumber = responseSequenceNumber;
    }

    public int getResponseSequenceNumber() {
        return responseSequenceNumber;
    }

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(deviceId);
        dest.writeString(propertyName);
        dest.writeString(propertyValue);
        dest.writeInt(type);
        dest.writeInt(sequenceNumber);
        dest.writeInt(responseSequenceNumber);
    }

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

    public void readFromParcel(Parcel in) {
        deviceId = in.readString();
        propertyName = in.readString();
        propertyValue = in.readString();
        type = in.readInt();
        sequenceNumber = in.readInt();
        responseSequenceNumber = in.readInt();
    }

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

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

    @Override
    public String toString() {
        return "Command [deviceId=" + deviceId + ", propertyName=" + propertyName
                + ", propertyValue=" + propertyValue + ", responseSequenceNumber="
                + responseSequenceNumber + ", sequenceNumber=" + sequenceNumber + ", type=" + type
                + "]";
    }

}

Qualcuno ha una vaga idea del motivo percui potrebbe dare problemi al momento della deserializzazione?
Ribadisco che effettivamente la deserializzazione va a buon fine ma viene sollevata una eccezione comunque.