Vra

Ek is tans besig om op 'n XMPP app 'op Android en ek wonder oor die beste manier om 'n ander tipe van Uitsondering gooi as 'n RemoteException om my aktiwiteit van my diens.

As dit onmoontlik blyk na 'n ander ding gooi as 'n RemoteException met behulp van IPC (jy kan nie te kenne gee niks in jou .aidl gooi), ek sien net twee oplossings:

  • Skep 'n luisteraar vir my aktiwiteit om op my persoonlike XMPP uitsondering, wat in werklikheid nie sal gegooi word maar net gestuur as 'n gewone voorwerp implementering van die Parcelable protokol luister.

  • Vang my XMPPException en gooi 'n RemoteException (met 'n inhoud opgedateer met my XMPPException) - Maar in daardie geval, hoe kan ek weet op my aktiwiteit as dit 'n XMPP of 'n ware RemoteException? Deur kodering die naam van die uitsondering en ontleding van dit op my aktiwiteit? Dit sou werklik gore wees.

Het jy enige idee? Het ek mis iets van die SDK dokumentasie?

Dankie.

Was dit nuttig?

Oplossing

As # 1 bedoel wat ek dink dit doen, wil ek dat -. Het die diens vang die uitsondering en noem 'n metode op 'n-AIDL gedefinieer terugbel voorwerp geskep en verskaf deur die aktiwiteit

Jy kan 'n voorbeeld van wat tegniek te sien in hierdie kliënt en diens projek, uit een van my boeke.

Ander wenke

Dit lyk asof ons persoonlike uitsonderings afgelei van RemoteException kan gooi. Sodat jy kan XMPPRemoteException het, of net 'n generiese MyRemoteException dat die oorspronklike uitsondering sal hou. Hier is 'n demo vir die tweede geval:

Server:

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

Kliënt:

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

Helper metode:

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

Uitsondering:

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

    public MyRemoteException() {}

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

Ek dink dit is onmoontlik om te bereik "Gooi 'n persoonlike uitsondering van 'n diens aan 'n aktiwiteit". Sien die bron van 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);
}

sodat ons kan weet dat ons kan net hierdie vyf uitsonderings bo gooi.

byvoorbeeld: As jou diens te gooi 'n IllegalArgumentException:

    @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!");
    }
...
}

jou kliënt sal kan dit vang:

            try {
                printer.addImage(0, null);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            }
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top