AIDL接口参数值中的“输入/输出/输入”?
Posted
技术标签:
【中文标题】AIDL接口参数值中的“输入/输出/输入”?【英文标题】:"In/out/inout" in a AIDL interface parameter value? 【发布时间】:2011-06-09 16:05:55 【问题描述】:我正在编写一个广播流媒体应用程序。我通过使用 AIDL 接口技术与服务通信,将“广播播放”作为远程服务运行。但我真的不明白一件事。
AIDL 接口参数值中的“out”是什么?
像这样:
String doSomething(in String a, out String[] b);
我理解“in”,即从activity调用方法时向远程发送数据。
什么是“out”,为什么我们需要在同一方法中使用“in”和“out”?在哪种情况下使用它们(“out/inout”)?为什么String[]
“出局”?
请帮忙..
【问题讨论】:
我认为@gladed 详尽地回答了您的问题。如果你检查他的答案会很好。 【参考方案1】:来了,
它只是一个指示数据流向的方向标签。 in - 对象从客户端转移到服务,仅用于 输入 out - 对象从客户端转移到仅使用的服务 用于输出。 inout - 对象从客户端转移到服务 用于输入和输出。所有非原始参数都需要一个方向标签来指示数据的走向。输入、输出或输出。
原语默认是in,否则不能
请注意,来自客户端的 RPC 调用是同步的。 您应该将方向限制到真正需要的范围内,因为编组参数的成本很高。示例: 请检查下面的 AIDL 接口以更好地理解它。
package com.hardian.sample.aidl;
import com.hardian.sample.aidl.TeamMember;
interface ITeamManageService
void getTeamCaptian(out TeamMember member);
void updateTeamMember(inout TeamMember member, in boolean isLeader);
oneway void removeTeamMember(in TeamMember member);
这里我们使用了out、in、inout方向标签来指示数据的走向。
getTeamCaptian(退出 TeamMember 成员): 得到球队的队长。 这里的“out”方向标签的意思是,当客户端调用该方法时,“member”对象没有相关数据, 但是服务器应该对“成员”对象进行更改,所以客户端应该得到更新的“成员”对象。 其实方法调用是同步的。
updateTeamMember(inout TeamMember member, in boolean isLeader): 更新团队的队长。 这里的“inout”方向标签的意思是,当客户端调用这个方法时,“member”对象里面有相关的数据。 服务器将使用输入数据并对其进行处理。流程完成后,客户应取回相关数据。 其实方法调用是同步的。
removeTeamMember(在 TeamMember 成员中) 从团队中删除成员。 这里的“in”方向标签意味着,“member”对象从客户端传输到服务,仅用于输入。 如果对服务中的“成员”对象进行任何更改,则它不会反映在客户端中。 方法调用是异步的,我们可以在方法签名中加上“oneway”关键字。 异步方法不能有“out”和“inout”参数,它们也必须返回 void。
【讨论】:
【参考方案2】:在AIDL 中,out
标记指定仅输出参数。换句话说,它是一个参数,在输入时不包含任何有趣的数据,但会在方法期间填充数据。
例如,复制字节数组的方法可以这样指定:
void copyArray(in byte[] source, out byte[] dest);
inout
标签表示参数对输入和输出都有意义。例如:
void charsToUpper(inout char[] chars);
这很重要,因为每个参数的内容都必须是marshalled(序列化、传输、接收和反序列化)。输入/输出标签允许 Binder 跳过编组步骤以获得更好的性能。
【讨论】:
AIDL 链接已关闭。正确的是AIDL 你的意思是调用方法时dest
对象是“空数组”还是“null”?
一个“out”参数应该接收一个具有未定义内容的非空对象。以上是关于AIDL接口参数值中的“输入/输出/输入”?的主要内容,如果未能解决你的问题,请参考以下文章