프로그래밍 언어/Android

오류 : The application may be doing too much work on its main thread

Rateye 2021. 8. 11. 11:26
728x90
반응형
질문 : 응용 프로그램이 주 스레드에 너무 많은 작업을 하고 있을 수 있습니다.

Android SDK / API 환경이 처음입니다. 플롯 / 차트를 그리는 것은 처음입니다. 3 개의 다른 무료 라이브러리를 사용하여 에뮬레이터에서 다양한 종류의 샘플 코드를 실행 해 보았지만 레이아웃 화면에 아무것도 표시되지 않았습니다. logcat은 다음 메시지를 반복합니다.

W/Trace(1378): Unexpected value from nativeGetEnabledTags: 0
 I/Choreographer(1378): Skipped 55 frames!  The application may be doing too much work on its main thread.

문제는 지속되지 않았고 라이센스 라이브러리의 평가판과 관련된 샘플 코드를 실행할 때 차트가 작동했습니다.

답변

출처 : Android UI : 건너 뛴 프레임 수정

Android 애플리케이션 개발을 시작하는 사람은 누구나 logcat “Choreographer (abc) : xx 프레임을 건너 뛰었습니다! 애플리케이션이 메인 스레드에서 너무 많은 작업을하고있을 수 있습니다.” 그래서 그것은 실제로 무엇을 의미하며, 왜 관심을 가져야하고 어떻게 해결해야하는지.

이것이 의미하는 바는 코드를 처리하는 데 시간이 오래 걸리고 그로 인해 프레임이 건너 뛰는 것입니다. 애플리케이션이나 DB 액세스의 중심에서 수행하는 무거운 처리 또는 스레드가 잠시 멈춰라.

다음은 더 자세한 설명입니다.

Choreographer를 사용하면 앱이 자체적으로 vsync에 연결하고 성능 향상을 위해 시간을 적절하게 조정할 수 있습니다.

Android보기 애니메이션은 내부적으로 동일한 목적으로 Choreographer를 사용합니다. 즉, 애니메이션 시간을 적절하게 맞추고 성능을 향상시킬 수 있습니다.

Choreographer는 모든 vsync 이벤트에 대해 알려주기 때문에 Choreographer.post * api가 전달한 Runnable 중 하나가 한 프레임의 시간 내에 완료되지 않아 프레임을 건너 뛰는 지 알 수 있습니다.

내 이해에서 안무가는 프레임 건너 뛰기를 감지 할 수만 있습니다. 왜 이런 일이 발생하는지 알 수 없습니다.

"응용 프로그램이 주 스레드에서 너무 많은 작업을 수행하고있을 수 있습니다."라는 메시지가 표시됩니다. 오해의 소지가 있습니다.

source : Logcat에서 안무가 메시지의 의미

걱정해야하는 이유

이 메시지가 Android 에뮬레이터에 표시되고 건너 뛴 프레임 수가 상당히 적 으면 (100 미만) 에뮬레이터가 느리다는 것을 확실하게 판단 할 수 있습니다. 이는 거의 항상 발생합니다. 그러나 건너 뛴 프레임 수가 300 개 이상인 경우 코드에 심각한 문제가있을 수 있습니다. Android 기기는 iOS 및 Windows 기기와 달리 다양한 하드웨어로 제공됩니다. RAM과 CPU는 다양하며 모든 장치에서 합리적인 성능과 사용자 경험을 원한다면이 문제를 해결해야합니다. 프레임을 건너 뛰면 UI가 느리고 느려져 바람직한 사용자 경험이 아닙니다.

그것을 고치는 방법

이를 수정하려면 처리 기간이 길거나 발생할 수있는 노드를 식별해야합니다. 가장 좋은 방법은 메인 UI 스레드와 분리 된 스레드의 크기에 관계없이 모든 처리를 수행하는 것입니다. 따라서 SQLite 데이터베이스에서 데이터에 액세스하거나 하드 코어 수학을 수행하거나 단순히 배열을 정렬 할 수 있습니다. 다른 스레드에서 수행하십시오.

이제 여기에 캐치가 있습니다. 이러한 작업을 수행하기위한 새 스레드를 생성하고 응용 프로그램을 실행할 때 "뷰 계층 구조를 생성 한 원래 스레드 만 뷰를 터치 할 수 있습니다"라는 오류 메시지가 표시됩니다. 안드로이드의 UI는 메인 스레드 또는 UI 스레드에 의해서만 변경 될 수 있다는 사실을 알아야합니다. 그렇게하려는 다른 스레드는 실패하고이 오류와 함께 충돌합니다. 당신이해야 할 일은 runOnUiThread 안에 새로운 Runnable을 생성하는 것이고이 runnable 안에서 UI와 관련된 모든 작업을해야합니다. 여기 에서 예를 찾으십시오.

그래서 우리는 메인 스레드에서 데이터를 처리하기위한 Thread와 Runnable을 가지고 있습니다. Android에는 UI 스레드에서 오랜 시간 프로세스를 수행 할 수있는 AsyncTask가 있습니다. 이는 애플리케이션이 데이터 기반 또는 웹 API 기반이거나 Canvas를 사용하는 빌드와 같은 복잡한 UI를 사용할 때 가장 유용합니다. AsyncTask의 힘은 백그라운드에서 작업을 수행 할 수 있고 처리를 완료하면 지연 효과를 일으키지 않고 UI에서 필요한 작업을 간단히 수행 할 수 있다는 것입니다. 이것은 AsyncTask가 Activity의 UI 스레드에서 파생되기 때문에 가능합니다. AsyncTask를 통해 UI에서 수행하는 모든 작업은 기본 UI 스레드와 다른 스레드이므로 사용자 상호 작용에 방해가되지 않습니다.

그래서 이것은 당신이 부드러운 안드로이드 응용 프로그램을 만들기 위해 알아야 할 것입니다. 그리고 제가 아는 한 모든 초보자는 그의 콘솔 에서이 메시지를 얻습니다.

출처 : https://stackoverflow.com/questions/14678593/the-application-may-be-doing-too-much-work-on-its-main-thread
728x90
반응형