我目前的工作上。应用程序'和我思考的最佳方式的不同类型的例外于一个异常,我的活动自我服务。

因为它似乎不可能扔的另一件事比一个异常使用IPC(你不能宣布扔任何东西在你的.aidl),我只是看见两个方案:

  • 创建一个监听我的活动,以听我的定义。例外,这实际上不会被扔但只是作为一个通常的对象实施的Parcelable协议。

  • 抓住我的XMPPException并把一个异常(与内容更新我的XMPPException)-但在这种情况下,我怎么会知道关于我的活动,如果它是一个。或者一个真正的异常?通过标记的名称,例外和解析我的的活动?这将是真的血腥。

你有任何想法?我错过什么从SDK文档?

谢谢。

有帮助吗?

解决方案

如果#1意味着什么,我认为它不,我会使用的--有的服务赶上的例外并呼吁的一种方法在一个AIDL定义的回对象的创建和提供的活动。

你可以看到一个例子,这种技术在这 客户服务 项目从我的书籍。

其他提示

看起来我们可以扔定的例外情况源自异常.所以你可以有XMPPRemoteException,或者只是一个通用的MyRemoteException,将保持原来的例外。下面是一个演示的第二种情况:

服务器:

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

客户:

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

辅助方法:

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

例外:

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

    public MyRemoteException() {}

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

我认为这是不可能实现的"抛出一个自定义的异常服务活动"。看到资源的包裹:

    /**
 * 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);
}

因此,我们可以知道,我们就可以把这五个例外情况上。

例如:如果你的服务扔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!");
    }
...
}

你的客户会可以抓住它:

            try {
                printer.addImage(0, null);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top