2013-12-13 6 views
1

AIDL 메서드와 인터페이스 "oneway"키워드는 비동기 바인더 호출 원격 프로세스에 대한 호출이며 호출 순서가 보장되지 않는다고합니다. 반면에,이 스레드 ( https://groups.google.com/forum/#!topic/android-developers/FFY-hg2Jx0M)의 다이앤 Hackborn (바인더의 저자)의 마지막 코멘트는 말한다 :AIDL "원터치"원격 호출의 주문 보증은 무엇입니까?

"배달의 주문이 대상 객체에 연결되어 있습니다 (그래서 당신은 다른 에 전화를받을 수 있습니다 인터페이스가 순서에 맞지 않음) "

동일한 인터페이스에 대한 호출이 해당 명령을 유지한다는 것이 좋습니다.

누구나이를 명확히 할 수 있습니까?

답변

0

내가 아는 한, 바인더의 모든 트랜잭션은 동기식입니다. 즉, 클라이언트가 호출을 시작하고 서버로부터의 응답을 기다리는 것을 의미합니다. 그러나 양방향 통신의 경우 서버가 이러한 호출을 수신하면 간단히 반환되므로 이러한 유형의 통신은 일방적입니다.

서비스의 호출은 서로 다른 바인더 스레드에서 처리되므로 동기 통신의 경우 클라이언트가 요청 후 응답을 수신 할 수 있습니다 (클라이언트가 서버로부터의 응답을 기다리므로). 단방향 호출의 경우 클라이언트에서 보낸 요청이 다른 바인더 스레드에서 처리되는 경우가 될 수 있습니다. 그래서 내 관점에서 볼 때, 그 명령이 정의되어 있지 않다고 기록되어 있습니다.

0

AIDL 호출은 기본적으로 메서드가 반환 될 때까지 클라이언트가 대기 상태가되지만 "oneway"키워드를 사용하는 경우에는 메서드 호출이 비동기 즉 즉시 반환되고 클라이언트가 나중에 콜백을받습니다. 순서 지정은 콜백에 대해 정의되지 않습니다.

10

일반적으로 일방 통행 호출은 비동기이며 순서 보장없이 다른 스레드에서 동시에 호출 될 수 있습니다. 그러나 시스템은 동일한 IBinder 오브젝트에서 발생하는 온웨이 호출에 대해 특별 주문 보증을 부과합니다.이 경우 트랜잭션은 원래 호출 순서대로 한 번에 하나씩 발송됩니다. 이 주문은 가 동일한 IBinder 객체에 한방향 호출의 특정한 경우에 적용됩니다. 다른 IBinder 오브젝트를 호출하거나 양방향 및 동기화 호출을 믹싱하는 경우에는 그 사이에 주문 보증이 제공되지 않습니다.

이 작업 방식은 커널에서 각 IBinder 객체가 전달할 일회성 트랜잭션의 큐를 가지고 있다는 것입니다. 단방향 호출이 대기열에 추가됩니다 (단방향이 아닌 호출이 대기열을 우회 함). 트랜잭션은 각 이전 트랜잭션이 완료 될 때마다 한 번에 하나씩 큐에서 전달됩니다. 따라서 이러한 호출이 다른 스레드에서 전달되는 것을 볼 수는 있지만 시스템은 한 번에 하나만 실행 중임을 확인합니다. (다시 단 하나의 IBinder 객체에 대해, 두 개의 서로 다른 IBinder 객체에 한방향 호출을 동시에 실행할 수 있습니다.) 가치 또한

+1

당신의 과정에서 지역의 객체에 만든 한방향 호출은 일반 메소드 호출로 작동하고 _not_ 비동기 것을 지적. – jham