마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

외부폰트를 적용하였더니, 리스트뷰가 너무 느려졌습니다.

0 추천
                tvListTitle    = (TextView) view.findViewById(R.id.tv_list_title);
                tvListContents = (TextView) view.findViewById(R.id.tv_list_contents);
                tvListPrice    = (TextView) view.findViewById(R.id.tv_list_price);
                tvListLocale   = (TextView) view.findViewById(R.id.tv_list_locale);
                
                tvListTitle   .setTypeface(Typeface.createFromAsset(getAssets(), "GULIM.TTC"));
                tvListContents.setTypeface(Typeface.createFromAsset(getAssets(), "GULIM.TTC"));
                tvListPrice   .setTypeface(Typeface.createFromAsset(getAssets(), "GULIM.TTC"));
                tvListLocale  .setTypeface(Typeface.createFromAsset(getAssets(), "GULIM.TTC"));
 
tvListTitle    
tvListContents 
tvListPrice    
tvListLocale   
이 4변수는 모두 TextView입니다. 굴림폰트를 Windows/fonts에서 assets에 복사하고,
폰트를 적용했더니... 리스트뷰가 상당히 느리네요. 종종 다운도 됩니다. 뭔가 잘못되서 그런걸까요?
 

 

뽀그 (520 포인트) 님이 2013년 9월 26일 질문
폰트를 읽어올때는 한번만 읽으세요 그거 다 메모리 잡아먹습니다

2개의 답변

+1 추천
 
채택된 답변
혹시 위 코드가 adapter에 getView 안에 들어가는 코드 인가요?

만약 그렇다면 asset에 접근해서 외부폰트 읽어오는 작업이 너무 많이 중복되는거 같네요.
whitesnow (8,920 포인트) 님이 2013년 9월 26일 답변
뽀그님이 2013년 9월 30일 채택됨
네 맞습니다. getView안에 들어갑니다.
말씀해주신데로

Typeface tt = Typeface.createFromAsset(getAssets(), "GULIM.TTC");
                
                tvListTitle   .setTypeface(tt);
                tvListContents.setTypeface(tt);
                tvListPrice   .setTypeface(tt);
                tvListLocale  .setTypeface(tt);

와 같이 적용해봐도 마찬가지로 느리네요 ㅠ;;;
Typeface tt = Typeface.createFromAsset(getAssets(), "GULIM.TTC");
이건 해당 adapter의 생성자에 들어가면 될거 같네요.
그리고 아랫분 답변처럼 viewholer 참고 하시면 성능 개선에 도움 됩니다.
정말 감사합니다.
덕분에 많은 도움이 되었요.
+1 추천
Typeface tt = Typeface.createFromAsset(getAssets(), "GULIM.TTC");
                
                tvListTitle   .setTypeface(tt);
                tvListContents.setTypeface(tt);
                tvListPrice   .setTypeface(tt);
                tvListLocale  .setTypeface(tt);

 

이렇게 변경하셨다고 하셨는데

tt 는 아답터의 멤버 변수인가요? getView 메소드의 로컬 변수인가요

로컬변수이면 의미가 없구요

멤버 변수로 하세요.

그리고 findViewById 계속 쓰시지 마세요.

이것도 느려집니다.

그래서 holder 패턴을 사용하죠. apiDemos 보면 나옵니다.
원조안드로이드 (58,190 포인트) 님이 2013년 9월 26일 답변
정말 감사합니다.
두분 덕분에 해결 할 수 있었네요.
...