2010-08-24 2 views
6

Bundle을 serializable 또는 parcelable 오브젝트와 함께 사용하면 마샬링이 실제로 발생하는지 궁금합니다. 번들에 넣는 즉시 요? 번들은 주로 두 화면 사이의 데이터를 전달하는 데 주로 사용되므로 (여기서는 IPC에 대해서도 언급하지 않습니다!) 객체를 마샬링하는 데 많은 포인트가없는 것 같습니다. 항상 메모리에 남아 있기 때문에 ? 번들에 넣을 때 직렬화 가능 객체가 항상 직렬화됩니까?

바로 가정에서 우리를 있습니까 정렬 화 (이라고해도 자바 직렬화 또는 Android 나누기는)

  1. 데이터가 다른 프로세스, 예를 들어,에 전달해야하는 경우에만 발생하는 것이 RMI 또는
  2. 구성 요소 (활동 또는 서비스)가 파괴되고 인스턴스 상태가 디스크에 기록되어야합니다.

내가 본 안드로이드 프레임 워크 엔지니어 (나는 그것이 다이앤 Hackborn했다 생각) 전자가 훨씬 빠릅니다 때문에 하나 Parcelable 대신 Serializable를 사용한다고 말한다. 얼마나 빨라 졌습니까? 그리고 객체가 대부분의 시간에 마샬링되지 않으면 (심지어 이것에 대한 우리의 가정이 옳았다 고 가정 할 때) 이것은 심지어 차이를 만들 것입니까?

답변

6

나는 그것을 이해했다고 생각합니다. 나는 기본적으로 전체 마지막 날 동안 오늘의 대부분을 디버깅 안드로이드 ParcelBundle 소스 코드를, 그리고 여기 그것이 작동하는 방법이다 :

  • 번들은 기본적으로 HashMap 주변 단지 래퍼이지만, 그것은에 지원합니다 소포 (즉, 마샬링) 내부지도 및 그 내용
  • 값을 번들에 넣으면 먼저이 내부지도를 파기 한 다음 그 값을 해당지도에 넣으십시오.
  • 지도가 지연되어 발생하는 것을 푸십시오 : it (예 : bundle.putParcelable()을 호출하여) 액세스하려는 경우에만이를 파싱합니다. 그럼에도 불구하고지도 자체를 파싱하지 만 그 값은 분석하지 않습니다. 이 값에 실제로 액세스하려고 할 때만 (예 : bundle.getParcelable ("key")을 사용하여) 값을 푸시하지 않습니다. 즉, 번들 내부에있는 항목을 소포하면 이러한 값에 다시 액세스하지 않으면 미확인이 발생하지 않습니다.

일반적으로 : NO 값은 단순히 Bundle에 넣음으로써 값을 구획하지 않습니다. 그 대신 번들을 다른 구성 요소 (활동 또는 서비스, 안드로이드가 왜 그렇게하는지, 기술적으로 아무런 IPC도 일어나지 않기 때문에 모르겠다)로 전달할 때 또는 그렇지 않으면 분할해야 할 때 분할이 발생합니다.

+0

면책 조항 : Google 앱의 디버깅에서 얻은 이점은 가치가 있습니다. – Matthias

+0

면책 조항 2 : 단지 오해를 피하기 위해 변수는 Bundle 소스 코드의 일부였습니다. 우리 자신 :-D – Matthias

0

나는 곧 그렇게 될 것이라고 생각합니다. 그리고 성능 향상은 직렬화가 필요한 리플렉션 덕분이라고 생각합니다. serializable과 externalizable의 성능 차이와 같다고 생각합니다.

관련 문제