Android AIDL:返回地图在服务级别工作但在客户端级别中断
Android AIDL: Returning Map works at service level but breaks at client level
正如在 How to return hashmap in an aidl file 线程中所讨论的,我返回 "Map" 而不是像 "Map" 这样的泛型映射或像 Hashmap 这样的 Map 实现。当我检查绑定的服务端输出时,我在地图中获得了所需的键值,即地图已正确填充。但是服务端的相同功能,当从客户端调用时,returns 一个空映射,因为我在服务中将我的映射初始化为:
Map myMap = new HashMap();
请注意,客户端服务合同很好,因为该服务还有其他 returns 布尔值的方法,其中一些是无效的。所有这些都正常工作。问题出在这个返回 Map 的方法上,我想我犯了一些语法错误。
下面是我的服务端实现:
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;
}
}
谁能帮忙指出这里的错误?
我只做了两件事就解决了这个可疑行为(可疑是因为相同的服务器-客户端代码在我的虚拟客户端和服务器 android 应用程序上工作,但在我的生产客户端和服务器应用程序上不起作用) :
- 服务器端和客户端的AIDL文件不同: 我注意到客户端的AIDL文件是服务器端AIDL文件的超集(客户端的接口有3方法,而在服务器端有 2 种方法)
- 清理所有环境:在重建我所有的 AIDL、客户端、服务器之前进行了清理构建 modules/Components。
虽然第一点对我来说仍然完全不合逻辑,但我想记下这个答案供人们评论,如果它在这种情况下可能有任何问题。
正如在 How to return hashmap in an aidl file 线程中所讨论的,我返回 "Map" 而不是像 "Map" 这样的泛型映射或像 Hashmap 这样的 Map 实现。当我检查绑定的服务端输出时,我在地图中获得了所需的键值,即地图已正确填充。但是服务端的相同功能,当从客户端调用时,returns 一个空映射,因为我在服务中将我的映射初始化为:
Map myMap = new HashMap();
请注意,客户端服务合同很好,因为该服务还有其他 returns 布尔值的方法,其中一些是无效的。所有这些都正常工作。问题出在这个返回 Map 的方法上,我想我犯了一些语法错误。
下面是我的服务端实现:
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;
}
}
谁能帮忙指出这里的错误?
我只做了两件事就解决了这个可疑行为(可疑是因为相同的服务器-客户端代码在我的虚拟客户端和服务器 android 应用程序上工作,但在我的生产客户端和服务器应用程序上不起作用) :
- 服务器端和客户端的AIDL文件不同: 我注意到客户端的AIDL文件是服务器端AIDL文件的超集(客户端的接口有3方法,而在服务器端有 2 种方法)
- 清理所有环境:在重建我所有的 AIDL、客户端、服务器之前进行了清理构建 modules/Components。
虽然第一点对我来说仍然完全不合逻辑,但我想记下这个答案供人们评论,如果它在这种情况下可能有任何问题。