중화사전망 - 옥스퍼드 사전 - 인텐트 데이터 크기 제한 및 TransactionTooLargeException 예외

인텐트 데이터 크기 제한 및 TransactionTooLargeException 예외

충돌 로그:

OOM 문제와 마찬가지로 바인더 통신으로 인해 충돌이 발생한 것이 한눈에 분명하지만 문제를 특성화하기는 쉽지만 문제를 찾기가 쉽지 않습니다.

공식 설명:

1. TransactionTooLargeException

간단히 말하면: 애플리케이션 프로세스의 모든 AIDL 호출은 Binder 트랜잭션 버퍼를 사용하며 이 크기는 버퍼는 1Mb에 불과합니다. 모든 원격 호출 매개변수의 총 크기 또는 이러한 호출의 반환 값이 1Mb를 초과하면 TransactionTooLargeException 예외가 발생합니다.

2. Parcelable 및 Bundle

바인더 전송 버퍼는 1MB의 제한된 크기 영역입니다. 이 버퍼는 모든 프로세스 간의 통신, 즉 바인더 통신에 사용됩니다. . 이러한 전송에는 onSaveInstanceState, startActivity 및 기타 시스템과의 상호 작용이 포함됩니다. 전송된 데이터가 이 크기를 초과하면 예외가 발생합니다.

특히 onSaveInstanceState 메소드의 경우 Activity가 반환될 때 데이터를 제공해야 하기 때문에 공식 웹사이트에서는 데이터 크기를 50K 이하로 권장합니다.

참고:

1. Bundle을 통해 데이터를 전달하는 한 직렬화 문제에 직면하게 됩니까?

아니요, 활동 간에 데이터를 전송할 때 먼저 프로세스 간 통신 문제를 고려해야 하며 Android는 Binder 메커니즘을 사용하여 프로세스 간 통신 문제를 해결합니다. 크로스 프로세스의 경우 복잡한 데이터에는 직렬화 및 역직렬화 프로세스가 포함되며 이는 값 전송(깊은 복사) 프로세스가 될 것입니다.

Fragment 자체는 Cross-Process를 포함하지 않습니다. Bundle을 사용하여 데이터를 전송하지만 Binder를 통과하지 않습니다. 즉, 직렬화 및 역직렬화가 없습니다. Fragment 데이터 전송과 관련된 Bundle은 실제로 원본 객체에 대한 참조를 전송합니다.

결론: Fragment의 setArguments(Bundle)를 통해 Bundle을 전달합니다. Bundle은 데이터 전송에 사용되지만 Binder를 통과하지 않습니다. 즉, 직렬화 및 역직렬화가 없습니다. Fragment 데이터 전송과 관련된 Bundle은 실제로 원본 객체에 대한 참조를 전송합니다. (실험적으로 DialogFragment가 팝업되면 객체를 전달합니다. Dialog에서 데이터가 수정된 후 Activity에서 객체가 수정됩니다.)

2. Activity onSaveInstanceState에 저장된 Bundle 정보가 저장됩니다. Activity 상태를 보존해야 하기 때문에 ActivityManager 프로세스에서 관리해야 하므로, Binding 데이터를 ActivityManager에 전달하기 위해 프로세스 간 통신을 수행하는 바인더 전송이 필요합니다.

따라서 onSaveInstanceState에는 Binder 버퍼 크기에 의해 자연스럽게 제한되는 Binder 전송도 포함됩니다.

3. FragmentStatePagerAdapter의 구현에는 결함이 있습니다. 기본 구현에서는 기록 Fragment 인스턴스의 상태 데이터 기록을 계속 저장하기 때문입니다. , 그리고 점차적으로 데이터가 축적되고 저장된 후 전송된 데이터 패킷의 크기는 결국 50KB를 초과했습니다.

/mmbiz_jpg/liaczD18OicSz3ctQsLW8lGAAMWev0a16PZoqAev5CViaTTBuUZrWNG1m27sIicfKrYZicMmjdP4WwFO53vicWToC3Ag/640?wx_fmt= jpeg amp;wxfrom=5amp;wx_lazy=1amp;wx_co =1

EventBus postSticky() 메소드를 사용하여 이벤트를 전송합니다. 그러면 이벤트가 다음 번에 호출될 때 등록된 구성요소에 이벤트를 꺼내서 던질 수 있도록 이벤트를 끈적끈적한 이벤트 맵 객체에 캐시합니다. 등기.

수신:

참조 링크:

빈번한 인터뷰어: Intent가 전송할 수 있는 데이터의 크기는 얼마나 됩니까? | 페이 알리의 제안!

Android----onSaveInstanceState의 데이터는 어디에 존재합니까? 왜 크기가 제한되어 있나요?

TransactionTooLargeException 원인 분석