자세한 설명은 다음과 같습니다.
Choreographer를 사용하면 앱이 vsync에 연결되고 성능을 향상시킬 수있는 적절한 시간을 지정할 수 있습니다.
Android 뷰 애니메이션은 내부적으로 Choreographer를 사용하여 애니메이션의 시간을 적절하게 조정하고 성능을 향상시킵니다.
Choreographer는 모든 vsync 이벤트에 대해 알려주므로 Choreographer.post * api가 전달한 Runnable 중 하나가 한 프레임 시간 내에 완료되지 않아 프레임을 건너 뛰는 지 여부를 알 수 있습니다.
내 이해에서 Choreographer는 프레임 건너 뛰기 만 감지 할 수 있습니다. 왜 이런 일이 발생했는지 말할 방법이 없습니다.
"응용 프로그램이 기본 스레드에서 너무 많은 작업을 수행하고있을 수 있습니다."메시지 오해의 소지가 있습니다.
source :
Logcat에서 안무가 메시지의 의미
왜 걱정해야합니까
이 메시지가 Android 에뮬레이터에서 팝업되고 건너 뛴 프레임 수가 상당히 적을 경우 (<100) 에뮬레이터가 느리게 안전하게 내기 할 수 있습니다. 거의 항상 발생합니다. 그러나 프레임 수가 건너 뛰고 300 + 이상이면 코드에 심각한 문제가 발생할 수 있습니다. Android 기기는 iOS 및 Windows 기기와 달리 다양한 하드웨어로 제공됩니다. RAM과 CPU는 다양하며 모든 장치에서 적절한 성능과 사용자 경험을 원하면이 문제를 해결해야합니다. 프레임을 건너 뛰면 UI가 느리고 느려져 바람직한 사용자 경험이 아닙니다.
고치는 방법
이를 해결하려면 처리 시간이 오래 걸리거나 발생할 수있는 노드를 식별해야합니다. 가장 좋은 방법은 기본 UI 스레드와 별 개인 스레드에서 크기가 작거나 크더라도 모든 처리를 수행하는 것입니다. 따라서 SQLite Database에서 데이터에 액세스하거나 하드 코어 수학을 수행하거나 단순히 배열을 정렬해야합니다. – 다른 스레드에서 수행
이제 여기에 캐치가 있습니다. 이러한 작업을 수행하기 위해 새 스레드를 작성하고 애플리케이션을 실행할 때 "보기 계층 구조를 작성한 원래 스레드 만 해당보기를 만질 수 있습니다"라는 오류가 발생합니다. 안드로이드의 UI는 메인 스레드 또는 UI 스레드에 의해서만 변경 될 수 있다는 사실을 알아야합니다. 이를 시도하는 다른 스레드는 실패하고이 오류와 충돌합니다. runOnUiThread 내부에 새로운 Runnable을 작성하고이 Runnable 내부에서 UI와 관련된 모든 조작을 수행해야합니다. 여기 에서 예를 찾으 십시오 .
메인 스레드에서 데이터를 처리하기 위해 Thread와 Runnable이 있습니다. 안드로이드에는 AsyncTask가있어 UI 스레드에서 장시간 프로세스를 수행 할 수 있습니다. 이것은 응용 프로그램이 데이터 구동 또는 웹 API 구동이거나 Canvas를 사용한 빌드와 같은 복잡한 UI를 사용할 때 가장 유용합니다. AsyncTask의 힘은 백그라운드에서 작업을 수행 할 수 있다는 것입니다. 처리를 마치면 지연 효과를 발생시키지 않고 UI에서 필요한 작업을 간단히 수행 할 수 있습니다. AsyncTask는 Activity의 UI 스레드에서 파생되기 때문에 가능합니다. AsyncTask를 통해 UI에서 수행하는 모든 작업은 기본 UI 스레드와 다른 스레드이므로 사용자 상호 작용에 방해가되지 않습니다.
그래서 이것은 부드러운 안드로이드 응용 프로그램을 만들기 위해 알아야 할 사항이며, 모든 초보자가 자신의 콘솔 에서이 메시지를 얻는다는 것을 알고 있습니다.