Epoxy의 스크롤이 긁혀서 재활용이 안 됐는지 알아봤어요.

이 문장은 24일째 문장이다

계기


페이지의 첫 번째 표시 속도를 높이기 위해 Epoxy의 RecyclerView(이하 Epoxy) 재구성을 사용했습니다.
대상 페이지의 구성은 여기에 있습니다.root는 Linearlayout 아래에 몇 개의 보기가 걸려 있습니다.
LinearLayout // rootのViewGroup
  ∟ RecyclerView
  ∟ RelativeLayout
  ∟ RecyclerView
  ∟ RecyclerView
  ∟ LinearLayout
  ∟ ...
  • 각 요소에 대한 addView다만, 요소 수가 상당히 많고 페이지가 처음 표시될 때 화면 밖의 요소의 처리도 이동한다.
  • Epoxy에서 화면 외 요소의 처리는 페이지 표시 시 이동하지 않기 때문에 페이지 표시의 고속화를 기대할 수 있다
  • LinearLayout을 Epoxy로 전환

  • 루트에 방금 배치된 LinearLayout을 Epoxy로 전환하고 하위 보기 코드를 EpoxyModelWithHolder 확장된 클래스로 이동
  • 동작 테스트

  • 시작 시 페이지가 빨라졌습니다(체감).적어도 화면 밖의 요소의 처리는 도망가지 않았다.
  • 오래된 단말기라면 굴러갈 때 간지럽다.
  • 위아래로 스크롤을 여러 번 반복하더라도 캐시가 작동하지 않습니다.Epoxy의 ViewPool 주변 설치를 봤습니다.
  • Eppxy가 ViewPool을 관리하는 곳입니다.


    ActivityRecyclerPool.kt
    internal class PoolReference(
        context: Context,
        val viewPool: RecyclerView.RecycledViewPool,
        private val parent: ActivityRecyclerPool
    ) : LifecycleObserver {
        private val contextReference: WeakReference<Context> = WeakReference(context)
    
        val context: Context? get() = contextReference.get()
    
  • Epoxy는 혼자 ViewPool을 관리하는 것 같습니다.RecyclerView에서는 ViewType당 최대 5개의 활성 인스턴스만 보존할 수 있지만 Epoxy는 이에 제한되지 않습니다.이 부근의 규격에서도 Epoxy와 RecyclerView가 서로 다른 설치를 하고 있음을 알 수 있다.
  • ActivityRecyclerPool.kt
  • RecyclerView에서 ViewPool에서 캐시 코드 가져오기


    RecyclerView.java
    // この辺りでキャッシュを探しているようです(おそらく)
    
    ViewHolder getScrapOrHiddenOrCachedHolderForPosition(int position, boolean dryRun) {
                final int scrapCount = mAttachedScrap.size();
    // 省略..
    
                final int cacheSize = mCachedViews.size();
                for (int i = 0; i < cacheSize; i++) {
                    final ViewHolder holder = mCachedViews.get(i);
    
    
    
  • RecyclerView에 저장된 ViewPool에서 캐시 찾기
  • 방법명에서 스며들었지만 ViewPool 이외에도 캐시를 유지하는 클래스가 있는 것 같습니다.나는 어댑터와 mChild Helper가 어떤 캐릭터인지 매우 궁금하다.
  • RecyclerView.java
  • 원인

  • 이번 재구성은 루트의 LinearLayout을 Epoxy로 변경합니다.하위 뷰에서 사용되는 RecyclerView가 그대로 유지되기 때문입니다.
  • Epoxy는 하나의 Activity 내의 Epoxy 사이에 그려진 View 캐시를 ViewPool에 저장하여 다음부터 사용할 수 있지만 Recyclerview의 ViewPool은 Epoxy와 다르다. 매번 inflate가 발생하기 때문에 낡은 단말기가 충돌한다.
  • 지원

  • Epoxy와 RecyclerView가 혼합된 것을 발견하면 ViewPool의 공유가 좋지 않기 때문에 RecyclerView를 Epoxy로 바꾸고 낡은 단말기를 확인하는 것도 편차를 줄였다.
  • 총결산

  • Epoxy는 중첩된 Epoxy라도 기본적으로 ViewPool을 공유할 수 있어 편리합니다.
  • Epoxy를 사용하고 있지만 오류가 있으면 하위 보기에서 RecyclerView 혼동이 있는지 확인하십시오.
  • 공식적으로ViePool에 대해 썼기 때문에 잘 읽는 것이 중요하다고 생각한다
  • 참고 자료

  • https://github.com/airbnb/epoxy/wiki/EpoxyRecyclerView#shared-view-pool
  • 좋은 웹페이지 즐겨찾기