Android 앱의 성능 개선②(RecyclerView.Adapter)

이 기사에서는 Android 앱의 성능을 향상시키는 방법에 대해 설명합니다.

개선 대상



목록 등을 보려면 RecyclerView를 사용할 수 있다고 생각합니다.
RecyclerView는 매우 유용한 클래스이지만 성능에는주의가 필요합니다.

측정



아래의 RecyclerView를 사용한 캘린더의 성능을 Systrace을 사용하여 측정했습니다.



그러면 Adapter onCreateViewHolder의 inflate에 시간이 걸리고 있다 (아래의 경우는 15.506ms) 것을 알았습니다.



onCreateViewHolder는 RecyclerView의 item 수만 호출되므로 onCreateViewHolder에 시간이 걸리면 성능에 상당한 영향을 미칩니다.

개선 방법



개선에는 RecyclerView의 item 생성에 inflate를 사용하지 않고 View를 생성(CustomView)하는 방법이 있습니다.
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DateAdapterHolder {
-        val view = inflater.inflate(R.layout.calendar_item, parent, false)
-        return DateAdapterHolder(view)
+        return DateAdapterHolder(
+                CalenderItemView(parent.context).apply {
+                    layoutParams = LinearLayout.LayoutParams(parent.width / 7, ITEM_HEIGHT.toInt())
+                }
+        )
     }

CalenderItemView.kt
class CalenderItemView @JvmOverloads constructor(
        context: Context,
        attrs: AttributeSet? = null,
        defStyle: Int = 0
) : LinearLayout(context, attrs, defStyle) {
    companion object {
        private val TEXT_SIZE = 20f.sp
        private val MARGIN_SIZE = 5f.sp
        val ITEM_HEIGHT = TEXT_SIZE + MARGIN_SIZE * 2
        private val textPaint = Paint().apply {
            textSize = TEXT_SIZE
        }
    }

    var date: String = ""
    var color: Int = Color.BLACK

    init {
        gravity = Gravity.RIGHT
        setBackgroundColor(Color.WHITE)
    }

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        textPaint.color = color
        canvas?.drawText(
                date,
                if (date.length == 1) TEXT_SIZE / 2 else 0f.sp,
                TEXT_SIZE + MARGIN_SIZE,
                textPaint
        )
    }
}

이 수정으로 onCreateViewHolder의 시간(Systrace에서 측정)이 1/10(평균 6.638ms에서 0.735ms)으로 개선되었습니다.

구현에 대한 자세한 내용은 아래를 참조하십시오.
htps : // 기주 b. 코 m / 요시 히로 카토 / 안 d 로이 d 사 mp ぇ s / t 네 / 4 8 또는 216 71bf4f147 854 4 8872b889639 3 온

보충



CustomView로 하면 Canvas에 텍스트나 Bitmap을 직접 그리게 되므로 TextView의 ellipsize 등을 사용할 수 없게 됩니다.

좋은 웹페이지 즐겨찾기