programing

응용 프로그램이 메인 스레드에서 너무 많은 작업을 수행하고 있을 수 있습니다.

copysource 2023. 6. 4. 18:32
반응형

응용 프로그램이 메인 스레드에서 너무 많은 작업을 수행하고 있을 수 있습니다.

안드로이드 SDK/API 환경은 처음입니다.그래프/차트를 그리려고 하는 것은 처음입니다.저는 3개의 다른 무료 라이브러리를 사용하여 에뮬레이터에서 다른 종류의 샘플 코드를 실행하려고 했지만 레이아웃 화면에 아무것도 표시되지 않습니다.로그캣이 다음 메시지를 반복하고 있습니다.

트레이스 포함(1378):nativeGetEnabledTags의 예기치 않은 값: 0I/안무가(1378):55 프레임 건너뛰기!응용 프로그램이 메인 스레드에서 너무 많은 작업을 수행하고 있을 수 있습니다. 

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

taked from : Android UI : 건너뛴 프레임 수정

안드로이드 애플리케이션을 개발하기 시작하는 사람은 로그캣 "안무가(abc): xx 프레임을 건너뛰었습니다! 애플리케이션이 메인 스레드에서 너무 많은 작업을 수행하고 있을 수 있습니다."그래서 그것은 실제로 무엇을 의미하며, 왜 당신이 그것을 걱정해야 하는지 그리고 어떻게 해결해야 하는지를 의미합니다.

이것은 코드 처리에 시간이 오래 걸리고 프레임이 건너뛰는 것을 의미합니다. 응용프로그램이나 DB 액세스의 핵심에서 수행 중인 일부 과도한 처리 또는 스레드가 잠시 중지되는 다른 작업 때문일 수 있습니다.

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

안무가는 앱이 직접 vSync에 연결하고 시간을 적절하게 조정하여 성능을 향상시킬 수 있도록 지원합니다.

Android View 애니메이션은 내부적으로 동일한 목적으로 Choorographer를 사용합니다. 즉, 애니메이션 시간을 적절하게 조정하고 성능을 향상시키기 위한 것입니다.

안무가는 모든 vSync 이벤트에 대해 알려주기 때문에 Choreographer.post * 아피스에 전달된 Runnables 중 하나가 한 프레임 내에 완료되지 않아 프레임을 건너뛸 수 있는지 알 수 있습니다.

제가 알기로는 안무가는 프레임 건너뛰기만 감지할 수 있습니다.왜 이런 일이 일어나는지 알 수 있는 방법이는 없습니다.

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

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

걱정해야 하는 이유

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

수리 방법

이 문제를 해결하려면 처리 시간이 길거나 발생할 수 있는 노드를 식별해야 합니다.가장 좋은 방법은 메인 UI 스레드와 분리된 스레드에서 아무리 작거나 크더라도 모든 처리를 수행하는 것입니다.SQLite Database에서 데이터에 액세스하거나 하드코어 연산을 수행하거나 단순히 어레이를 정렬하는 등 다양한 작업을 수행할 수 있습니다. – 다른 스레드에서 수행하십시오.

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

그럼 메인 스레드에서 데이터를 처리할 수 있는 스레드와 Runnable이 있는데, 다른 것은 무엇입니까?Android에는 UI 스레드에서 장시간 프로세스를 수행할 수 있는 AsyncTask가 있습니다.이 기능은 애플리케이션이 데이터 기반 또는 웹 API 기반이거나 캔버스를 사용하여 빌드하는 것과 같은 복잡한 UI를 사용할 때 가장 유용합니다.AsyncTask의 장점은 백그라운드에서 작업을 수행할 수 있다는 것입니다. 처리가 완료되면 지연 효과 없이 UI에서 필요한 작업을 수행할 수 있습니다.이는 비동기 작업이 활동의 UI 스레드에서 파생되기 때문에 가능합니다. 비동기 작업을 통해 UI에서 수행하는 모든 작업은 기본 UI 스레드와 다른 스레드이며 사용자 상호 작용에 지장이 없습니다.

그래서 이것이 매끄러운 안드로이드 애플리케이션을 만들기 위해 알아야 할 것이고 제가 알기로는 모든 초보자들이 그의 콘솔에 이 메시지를 가지고 있습니다.

다른 사람들이 위에서 대답했듯이, "55프레임 건너뛰기!"는 애플리케이션에 일부 무거운 처리가 있다는 것을 의미합니다.

저의 경우, 저의 지원서에는 무거운 과정이 없습니다.저는 모든 것을 두 번, 세 번 확인했고 제가 생각하기에 조금 무거운 과정들을 제거했습니다.

골격만 남을 때까지 단편, 활동, 라이브러리를 제거했습니다.하지만 여전히 문제는 사라지지 않았습니다.저는 자원을 확인하기로 결정했고, 제가 사용하는 아이콘과 배경이 꽤 크다는 것을 발견했습니다. 자원의 크기를 확인하는 것을 잊어버렸기 때문입니다.

따라서 위의 답변 중 도움이 되지 않는 경우 리소스 파일 크기도 확인할 수 있습니다.

저도 같은 문제를 겪었습니다.
저는 그림 속 배경 이미지를 사용하는 경우였습니다.그 특정 이미지는 약 130kB였고 제 안드로이드 앱에서 스플래시 화면과 홈 페이지에서 사용되었습니다.

해결책 - 저는 방금 그 특정 이미지를 드로잉 가능한 xxx 폴더에서 드로잉 가능한 폴더로 전환했고 배경에 있는 많은 메모리를 확보할 수 있었고 건너뛰기 프레임은 더 이상 건너뛰지 않았습니다.

업데이트 배경 그리기 가능한 파일을 저장하기 위해 'nodp' 그리기 가능한 리소스 폴더를 사용합니다.
밀도가 한정된 그리기 가능한 폴더 또는 그리기 가능한 노드가 우선입니까?

UI 스레드에서 지연되는 또 다른 일반적인 원인은 Shared Preferences 액세스입니다.를 때.PreferenceManager.getSharedPreferences처음으로 유사한 메서드를 사용하는 경우에는 관련된 .xml 파일이 즉시 로드되고 동일한 스레드에서 구문 분석됩니다.

중 빨리 되는 첫 번째 것입니다( 이문해결좋는하예스방백가중드한능하한빨리시것공작다니입트는는하기되 거유리설로를본나정드는그라운제레를서법드에은예▁one▁frome,:onCreate응용 프로그램 클래스)를 참조하십시오.이렇게 하면 기본 설정 개체를 사용할 때 이미 구성되어 있을 수 있습니다.

안타깝게도 시작 초기 단계(예: 초기 활동 또는 응용 프로그램 자체)에서 기본 설정 파일을 읽어야 하는 경우가 있습니다.이러한 경우에도 다음을 사용하여 UI를 중지하지 않을 수 있습니다.MessageQueue.IdleHandler메인 스레드에서 수행해야 하는 다른 모든 작업을 수행한 다음, 활동이 완전히 그려지면 코드를 실행할 유휴 처리기를 설치합니다.이 실행 기능을 사용하면 너무 많은 그리기 작업을 지연하거나 안무가를 불쾌하게 만들지 않고 공유 기본 설정에 액세스할 수 있습니다.

저도 같은 문제가 있었습니다.Android Emulator는 Android < 6.0> 벽동작습니했다게완하서에▁android▁android다니습▁6▁<했▁em동작. 50)를 했을 때 했습니다.I/Choreographer: Skipped frames통나무 속에

이 파일을 변경하여 해결했습니다.hardwareAccelerated에 대한 선택권.true다음과 같이:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">

    <application android:hardwareAccelerated="true">
        ...
    </application>
</manifest>

2022년 1월 업데이트.@M의 댓글에 의하면.Ed: > = 14 API를 대상으로 하는 경우 하드웨어 가속이 기본적으로 활성화됩니다.

앱 성능을 향상시키기 위해 다음 전략을 사용해 보십시오.

  • 가능한 경우 멀티 스레드 프로그래밍을 사용합니다.스마트폰에 코어가 하나(프로세서에 코어가 두 개 이상 있는 경우 스레드가 서로 다른 코어에서 실행될 수 있음)라도 성능 면에서 큰 이점을 얻을 수 있습니다.당신의 앱 로직을 UI와 분리하는 것이 유용합니다.Java 스레드, AsyncTask 또는 IntentService를 사용합니다.이것 좀 봐요.
  • Android 개발 웹 사이트의 misc 성능 팁을 읽고 따르십시오.여기를 확인하세요.

전문가는 아니지만 안드로이드 애플리케이션에서 웹 서버로 데이터를 보내고 싶을 때 이 디버깅 메시지가 표시되었습니다.AsyncTask 클래스를 사용하고 백그라운드에서 데이터 전송을 수행했지만, 사용한 서버에서 결과 데이터를 다시 가져오기 위해 사용한 AsyncTask 클래스의 get() 메서드는 UI를 동기화하므로 UI가 너무 오래 기다려야 합니다.그래서 제 조언은 당신의 앱이 모든 네트워크 지향 작업을 별도의 스레드에서 수행하도록 하는 것입니다.

저도 같은 문제가 있었습니다.제 경우에는 두 개의 중첩된 상대 레이아웃이 있었습니다.상대 레이아웃은 항상 두 개의 측정 패스를 수행해야 합니다.상대 레이아웃을 중첩하면 지수 측정 알고리즘이 제공됩니다.

이미지 최적화...100KB보다 큰 이미지 사용 안 함...이미지 로드는 CPU를 너무 많이 사용하여 앱이 중단됩니다.

이는 일반적으로 메인 스레드에서 거대한 프로세스를 실행할 때 발생합니다.200개 미만의 프레임을 건너뛰어도 괜찮지만, 200개 이상의 프레임을 건너뛰면 응용 프로그램 UI 스레드 속도가 느려질 수 있습니다.작업자 스레드라는 새 스레드에서 이러한 프로세스를 수행한 후 UI 스레드에 액세스하여 작업을 수행할 때(예: 보기로 작업하기, 보기 찾기 등) 처리 결과를 표시하기 위해 핸들러를 사용하거나 OnUiThread를 실행할 수 있습니다.이것은 문제를 완전히 해결합니다.작업자 스레드를 사용하는 것은 매우 유용하거나 이러한 경우에 사용해야 합니다.

https://stacklearn.ir

저도 같은 문제가 있었습니다.다른 컴퓨터에서 코드를 실행해 보니 정상적으로 작동했습니다.그러나 내 것에는 "애플리케이션이 메인 스레드에서 너무 많은 작업을 수행하고 있을 수 있습니다."라고 표시되어 있습니다.

Android studio [File -> Invalidated Cache / Restart -> "Invalidate and Restart"를 클릭하여 문제를 해결했습니다.

제 앱도 같은 문제가 있었습니다.하지만 그것은 카드 목록과 텍스트를 표시하는 것 외에는 하지 않았습니다.백그라운드에서 실행 중인 항목이 없습니다.그러나 몇 가지 조사 결과 카드 배경에 설정된 이미지가 작음에도 불구하고(350kb) 이 원인인 것으로 나타났습니다.그런 다음 http://romannurik.github.io/AndroidAssetStudio/index.html 을 사용하여 이미지를 9개의 이미지로 변환했습니다.
이것은 저에게 효과가 있었습니다.

저의 경우, 실수로 어떤 방법에 브레이크 포인트를 설정했기 때문입니다.일단 클리어를 하고 나니 메시지가 사라지고 성능이 많이 향상되었습니다.

내가 처음에 사용한 것처럼 더 선호하는 것은SVG유형 할 수 모든 합니다.PNG그리고.JPG 처리 도구를 예: 다과같일이처사리도스소는)Adobe Photoshop또는Fotosizer가장 쉬운 방법 중 하나는 모든 이미지 파일을 초기 크기의 거의 50%로 줄이는 데 도움이 되는 온라인 이미지 압축 도구입니다.

이것은 사실 문제가 아닙니다.이 문제는 디버거를 오래 사용할 때 발생합니다.브레이크 지점을 탈거하고 다시 점검하십시오.

그리드 레이아웃에서 그리기 가능한 png 파일을 많이 사용하는 앱을 개발하다가 같은 문제가 생겼습니다.또한 코드를 최대한 최적화하려고 노력했습니다.하지만 저한테는 잘 안 됐어요그리고 나서 저는 그 png의 크기를 줄이려고 노력했습니다.그리고 그것이 완전히 잘 작동한다고 추측합니다.그래서 제 제안은 인출 가능한 자원의 크기를 줄이는 것입니다.

이 문제에 대해 많은 연구개발을 한 후에 해결책을 얻었습니다.

저의 경우 2초마다 실행되고 실행되는 서비스를 사용하고 있습니다.UI 스레드, 문제가 있는지 궁금했지만 전혀 없었습니다.제가 발견한 다음 문제는 제가 may 앱에서 큰 이미지를 사용하고 있다는 것이고 그것이 문제입니다.

이미지를 제거하고 새 이미지를 설정했습니다.

결론 :- 당신의 코드를 조사해 보세요. 당신이 사용하고 있는 큰 크기의 원시 파일이 있습니다.

먼저 경고문을 읽습니다.메인 스레드에 더 많은 부하가 걸린다고 쓰여 있습니다.따라서 여러분이 해야 할 일은 스레드에서 더 많은 작업으로 기능을 실행하는 것입니다.

아직 해결되지 않았지만 해결할 것입니다.컴포지블 기능(버튼) 하나와 논리로 "com" 여부를 확인하는 작은 프로젝트를 위해.whatsapp" 패키지가 장치(에뮬레이터)에 존재합니다. 시뮬레이터를 시작하는 동안 동일한 로그에 다음이 있습니다.

I/Choreographer: Skipped 34 frames!  The application may be doing too much work on its main thread.

텍스트 보기에서 RoundBackgroundColorSpan!이었던 저의 경우, 저는 그것을 제거합니다. (픽셀 4XL이나 삼성 노트 10+와 같은 실제 스마트폰에서는 나타나지 않지만 칩 장치에서는 이렇게 느리게 보기 때문에 머리를 써서 찾습니다.)

응용 프로그램에서 비동기/대기 기능을 사용하는 경우 이는 정상입니다.

언급URL : https://stackoverflow.com/questions/14678593/the-application-may-be-doing-too-much-work-on-its-main-thread

반응형