티스토리 뷰

나는 비슷한 문제로 어려움을 겪고 있었다. 언뜻보기에 우리는 항상 구획 된 객체에서 새로운 깊은 사본을 얻는 것처럼 보입니다. 또한, 심지어 거기에 일부 사용하는 것이 좋습니다 StackOverflow의 답변 Parcelable클론 객체 인터페이스. 이 모든 것이 주제에 대한 혼란을 증가시킵니다.

많은 검색과 인터넷 검색을 통해 찾은 내용은 다음과 같습니다.

  • 공식 Parcel 문서를 자세히 살펴보십시오 . 다음은 중요한 인용문입니다.

Parcel의 특이한 기능은 활성 개체를 읽고 쓰는 기능입니다. 이러한 객체의 경우 객체의 실제 내용이 기록되지 않고 객체를 참조하는 특수 토큰이 기록됩니다. Parcel에서 객체를 다시 읽을 때 객체 의 새 인스턴스 가 아니라 원래 작성된 것과 똑같은 객체에서 작동하는 핸들을 얻습니다 .

보시다시피 구획을 해제하는 동안 복사되지 않는 특수 객체가 있습니다. 그러나 이것은 여전히 ​​약간 혼란 스럽습니다. 가비지 수집을 방지하는 원래 객체에 대한 또 다른 강력한 참조가 있다는 의미입니까? 그리고 그러한 객체의 사용 사례는 무엇입니까?

  • 앞서 언급 한 질문에 답하기 위해 Android 소스 코드 를 살펴보기로 결정했습니다 . 내가 찾던 방법은 readStrongBinder하고 writeStrongBinder있는 소포 수신 / 전송 될 때 문서에 따른 새로운 객체 생성을 유발하지 않습니다. 그리고 ResultReceiver.java 클래스 에서 원하는 답변을 찾은 것 같습니다 . 다음은 흥미로운 라인입니다.

    mReceiver = IResultReceiver.Stub.asInterface(in.readStrongBinder());
        

    이 라인이 실제로 무엇을하는지 이해하려면 공식 AIDL 문서 로 가야합니다 . 다음은 가장 중요한 부분입니다.

호출 클래스가 AIDL로 정의 된 원격 인터페이스를 호출하기 위해 취해야하는 단계 :
...
5. onServiceConnected () 구현에서 IBinder 인스턴스 (서비스라고 함)를 받게됩니다. YourInterfaceName.Stub.asInterface ((IBinder) service)호출 하여 리턴 된 매개 변수를 YourInterface 유형으로 캐스트하십시오.

IPC 서비스 호출에 대한 몇 가지 의견 :

개체는 프로세스 전체에서 참조 계산 됩니다.

모든 것을한데 모아 보겠습니다.

  1. 구획 된 객체는 딥 복사 프로세스없이 추출 할 수 있습니다.
  2. readStrongBinder메서드를 사용하여 구획 된 객체를 읽는 경우 새 인스턴스가 생성되지 않습니다. 우리는 원래 객체에 대한 새로운 참조를 objtain하고이 참조는 할당 해제를 방지 할 수 있습니다.
  3. 소포가 수신 된 후 객체가 딥 카피되는지 여부를 확인하려면 구체적인 Parcelable인터페이스 구현을 자세히 살펴 봐야합니다 .
  4. Android 문서는 매우 혼란 스러울 수 있으며 올바르게 이해하는 데 많은 시간이 걸릴 수 있습니다.

이 정보가 도움이되기를 바랍니다.

Parcelable객체에 대한 혼란 이 심각한 문제를 일으킬 수 있는 실제 사례에 대해 읽고 싶다면 블로그 게시물을 확인하세요 .



출처
https://stackoverflow.com/questions/39916021
댓글
공지사항
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31