Frage

Im Moment arbeite ich an einem XMPP App‘auf Android und ich grüble über den besten Weg, um eine andere Art von Ausnahme als ein Remote meiner Tätigkeit von meinem Dienst zu werfen.

Da es unmöglich scheint, eine andere Sache als ein Remote zu werfen IPC (Sie können nicht erklären, alles in Ihrem .aidl zu werfen), ich sehe nur zwei Lösungen:

  • Erstellen Sie einen Hörer für meine Tätigkeit auf meiner benutzerdefinierten XMPP Ausnahme zu hören, die in der Tat das Parcel Protokoll implementiert.

  • nicht geworfen werden, sondern nur als ein gewöhnliches Objekt gesendet
  • meine XMPPException Fang und eine Remote (mit einem Gehalt mit meinem XMPPException aktualisiert) werfen - Aber in diesem Fall, wie konnte ich wissen, auf meine Tätigkeit, wenn es sich um eine XMPP oder eine echte Remote ist? Durch den Namen der Ausnahme Tagging und es auf meiner Tätigkeit Parsen? Es wäre wirklich Blut.

Haben Sie eine Idee? Habe ich etwas von der SDK-Dokumentation verpassen?

Danke.

War es hilfreich?

Lösung

Wenn # 1 bedeutet, was ich denke, es funktioniert, ich verwenden würde -. Haben den Service fangen die Ausnahme und rufen eine Methode auf einem AIDL definierten Callback-Objekt durch die Aktivität erstellt und geliefert

Sie können ein Beispiel dieser Technik in diesem Client sehen und Service Projekt, von einem meiner Bücher.

Andere Tipps

Es sieht aus wie wir individuelle Ausnahmen, die von Remote werfen. So können Sie haben XMPPRemoteException, oder einfach nur eine generische MyRemoteException, der die ursprüngliche Ausnahme halten wird. Nachfolgend finden Sie eine Demo für den zweiten Fall:

Server:

try {
    ...
}
catch(XMPPException e) {
    throw new MyRemoteException(e);
}

Client:

try {
    service.someCall();
}
catch(MyRemoteException e) {
    rethrow(e);
}

Helper-Methode:

private void rethrow(MyRemoteException e) throws Exception {
    if(e.innerException instanceof XMPPException)
        throw (XMPPException)e.innerException;
    else
        throw e.innerException;
}

Ausnahme:

public class MyRemoteException extends RemoteException {
    private static final long serialVersionUID = 1L;
    public Exception innerException;

    public MyRemoteException() {}

    public MyRemoteException(Exception innerException) {
        this.innerException = innerException;
    }
}

Ich denke, es ist unmöglich zu erreichen „um eine benutzerdefinierte Ausnahme von einem Dienst zu einer Aktivität werfen“. Sehen Sie sich die Ressource von Parcel:

    /**
 * Use this function for customized exception handling.
 * customized method call this method for all unknown case
 * @param code exception code
 * @param msg exception message
 */
public final void readException(int code, String msg) {
    switch (code) {
        case EX_SECURITY:
            throw new SecurityException(msg);
        case EX_BAD_PARCELABLE:
            throw new BadParcelableException(msg);
        case EX_ILLEGAL_ARGUMENT:
            throw new IllegalArgumentException(msg);
        case EX_NULL_POINTER:
            throw new NullPointerException(msg);
        case EX_ILLEGAL_STATE:
            throw new IllegalStateException(msg);
    }
    throw new RuntimeException("Unknown exception code: " + code
            + " msg " + msg);
}

so können wir wissen, dass wir nur über diese fünf Ausnahmen werfen.

zum Beispiel: Wenn Ihr Dienst eine Illegal werfen:

    @Override
public void addImage(final int align, final byte[] imageData) throws RemoteException {
    log("/// addImage ///");
    if (imageData == null) {
        throw new IllegalArgumentException("The second argument(image data) can not be empty!");
    }
...
}

Ihr Kunde kann es fangen:

            try {
                printer.addImage(0, null);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top