【问题标题】:Android AIDL: Returning Map works at service level but breaks at client levelAndroid AIDL:返回地图在服务级别工作,但在客户端级别中断
【发布时间】:2017-03-26 14:14:27
【问题描述】:

正如How to return hashmap in an aidl file 线程中所讨论的,我返回的是“Map”,而不是像“Map”这样的泛型映射或像Hashmap 这样的Map 实现。当我检查绑定的服务端输出时,我在地图中获得了所需的键值,即正确填充了地图。但是服务端的同一个函数,当从客户端调用时,返回一个空地图,因为我在服务中将我的地图初始化为:

Map myMap = new HashMap();

请注意,客户端服务合同是好的,因为服务有其他返回布尔值的方法,其中一些是无效的。他们都工作正常。问题只是这个返回地图的方法,我想我在做一些语法错误。

以下是我的服务端实现:

public Map getStatus() {
    List<MyObject> MyList = new ArrayList<>();
    if (myDaggerInjectedObject != null) {
        MyList = myDaggerInjectedObject.getMyList();
    }
    Map myMap = new HashMap();
    for (MyObject myObject : MyList) {
        myMap.put(myObject.getScannableId(), myObject.getStatus().name());
    }
    return myMap;
}

下面是我调用上述绑定服务方法的客户端代码:

public Map getStatus() throws RemoteException {
    try {
        Map status = myService.getStatus();
        // the status object is set to blank hashmap, it should have some data i.e key-value pair
        return status;
    } catch (RemoteException e) {
        Log.e(TAG, "Service connection not available");
        throw e;
    }
}

有人可以帮忙指出这里的错误吗?

【问题讨论】:

  • 它应该,如果MyList 不为空,是吗?试过Log.dMyList的大小?
  • 已验证,MyList 不为空。当直接从服务应用程序端调用服务方法时,会返回正确的填充地图,只有从客户端应用程序调用时才会出现问题。
  • 然后进行测试只需调用myMap.put("key", "value"); 并重试
  • myObject.getScannableId()myObject.getStatus().name()返回什么类型?
  • @Vasiliy,这两个都返回字符串。此外,正如我所提到的,当从服务端本身调用方法时,映射正确地填充了字符串键值。

标签: android aidl


【解决方案1】:

我只做了两件事,解决了这种可疑的行为(可疑,因为相同的服务器-客户端代码在我的虚拟客户端和服务器 android 应用程序上运行,但在我的生产客户端和服务器应用程序上不起作用):

  1. 服务器端和客户端的不同AIDL文件:我注意到客户端的AIDL文件是服务器端的一个超集(客户端接口有3个方法,而服务器端有2个方法)
  2. 清理所有环境:在重建我的所有 AIDL、客户端、服务器模块/组件之前进行了清理构建。

虽然第一点对我来说仍然不合逻辑,但我想记下这个答案,让人们发表评论,如果在这种情况下可能有任何问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-19
    • 2012-04-23
    • 1970-01-01
    • 2012-01-29
    • 2014-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多