开发者社区 问答 正文

将自定义异常从服务抛出到活动

我目前正在使用Android上的XMPP应用程序,并且正在考虑从服务中向活动抛出不同于RemoteException的异常类型的最佳方法。

由于似乎不可能使用IPC抛出比RemoteException还要多的事情(您无法声明要在.aidl中抛出任何东西),我只看到两个解决方案:

为我的活动创建一个侦听器,以侦听我的自定义XMPP异常,该异常实际上不会被抛出,而只是作为实现Parcelable协议的常规对象发送。

赶上我的XMPPException并抛出RemoteException(内容已使用XMPPException更新)-但是在那种情况下,如何得知我的活动是XMPP还是真正的RemoteException?通过标记异常的名称并在我的活动中对其进行解析?真的很血腥。

你有什么主意吗 ?我是否错过了SDK文档中的某些内容?

谢谢。

展开
收起
Puppet 2020-01-25 21:27:02 360 分享 版权
阿里云 AI 助理回答

在Android开发中,处理跨进程通信(IPC)时确实存在一些限制,特别是当涉及到异常传递时。您提到的两种方法是常见的解决策略,但这里还有另一种更简洁的方法可以考虑:

使用ResultReceiver

Android提供了ResultReceiver类,它允许在不同线程或进程间传递结果(包括错误信息),而不仅仅是简单的成功/失败标志。您可以自定义一个ResultReceiver来封装您的XMPP异常信息,并通过IntentService或其他后台任务将这个ResultReceiver对象作为参数传递。

步骤如下:

  1. 创建自定义ResultReceiver子类:在这个子类里,您可以通过重写onReceiveResult方法来处理从服务返回的不同结果,包括异常情况。您可以在结果代码和Bundle中包含有关异常的详细信息。

    class XMPPResultReceiver extends ResultReceiver {
        public XMPPResultReceiver(Handler handler) {
            super(handler);
        }
    
        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
            super.onReceiveResult(resultCode, resultData);
    
            if (resultCode == RESULT_ERROR) {
                // 从Bundle中获取异常信息并处理
                String errorMessage = resultData.getString("errorMessage");
                // 处理异常逻辑...
            } else {
                // 成功逻辑...
            }
        }
    }
    
  2. 在Activity中创建并使用ResultReceiver:初始化这个自定义的ResultReceiver,并将其与服务交互的操作关联起来。

    XMPPResultReceiver receiver = new XMPPResultReceiver(new Handler());
    Intent intent = new Intent(this, YourService.class);
    intent.putExtra("receiver", receiver);
    startService(intent);
    
  3. 在服务端处理并发送结果:在服务中,根据操作的结果(包括异常情况),使用之前传递进来的ResultReceiver实例调用send方法,将结果(或错误信息)发送回Activity。

    Bundle resultData = new Bundle();
    if (/* 发生了XMPP异常 */) {
        resultData.putString("errorMessage", "具体的XMPP异常信息");
        receiver.send(RESULT_ERROR, resultData);
    } else {
        // 正常处理逻辑
        receiver.send(RESULT_OK, resultData);
    }
    

这种方法避免了直接抛出和捕获RemoteException的复杂性,同时提供了一种灵活且类型安全的方式来传递各种结果和异常信息。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: