2012-05-13 2 views
0

나 자신에 의해 뷰를 구현하면 뷰의 onDraw 메서드가 반복적으로 호출됩니다. 이로 인해 심각한 성능 문제가 발생합니다. 코드가 너무 복잡해서 여기에 붙여 넣을 수 없습니다. 누구나 가능한 이유를 말해 줄 수 있니? 나는 내 손가락으로 시야를 만지지 않았다.안드로이드에서 View의 onDraw 메서드를 반복적으로 호출하는 조건은 무엇입니까?

+0

코드를 게시하면 문제를 해결하는 가장 좋은 방법입니다. :) –

+0

약 70,000 줄의 코드가 포함 된 프로젝트가 다른 사람들에 의해 작성되었습니다. 그래서 코드를 붙여 넣지 않았습니다. 정말 미안 해요. 다음에 그런 일은 없을거야. –

+0

나는 downvotes에 동의하지 않는다. 문제는 완벽하게 타당합니다 - 기본적으로 문제를 진단하는 방법에 대한 아이디어를 묻습니다. 거대한 코드 덤프를 게시하는 것보다 훨씬 낫습니다 ([Stack Overflow가 모든 것을 읽지는 않습니다] 참조) (http://meta.stackexchange.com/a/129787/156967)). –

답변

1

이유 중 하나는 onDraw 메서드가 (아마도 간접적으로)보기를 무효화하는 일부 메서드를 호출하는 것입니다. 또 다른 가능성은 프로그램에서 전혀 관련이없는 무언가가 다시 그리기를 일으키는 것입니다. 이 실험을 해보십시오 : 드로잉 코드를 주석으로 처리하고 단순한 선 그리기와 같은 간단한 것을 대체하여 작동하는지 확인하십시오. 반복되는 그림이 사라지면 코드가 onDraw입니다. 문제가 다시 나타날 때까지 한 번에 한 번에 현재 코드를 복원하기 시작한 다음 추적 할 수 있습니다.

실험을 시도 할 때 문제가 해결되지 않으면 코드에서 다른 부분 (작업자 스레드 일 가능성이 있음)이 보이게되어보기가 무효화됩니다.

+0

Eclipse의 검색 기능을 사용하여 invalidate() 메소드 또는 postInvalidate() 코드를 검색 할 수도 있습니다 (Fang Yeng이 Eclipse를 사용한다고 가정) – Kerry

+0

Kerry와 Ted, 정말로 도움을 주셔서 감사합니다. 그리고 문제가 잘못된 장소에서'invalidate()'에 의해 발생한다는 것을 알았습니다. 문제 해결됨! –

0

오늘 같은 문제가있었습니다. 내보기 하위 클래스에서 invalidate()를 재정 의하여 그것을 해결 :

@Override 
void invalidate() { 
    super.invalidate(); 
} 

은 그 때 나는 invalidate() 내부에 중단 점을 설정하고 치고 기다렸다. 그랬을 때, 나는 전화의 스택 트레이스와 기분 나쁜 발신자를 가지고 있었다. 수수께끼는 2 분 만에 해결되었습니다.

그래도 해결되지 않으면보기에서 다른 무효화 메서드를 재정의하는 것이 좋습니다.

관련 문제