Повышение производительности BaseAdapter с помощью растрового декодирования - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь разработать приложение, в котором пользователь делает снимок, и он сохраняется в галерее.Путь к этому изображению сохраняется в базе данных в виде строки.У меня есть GridView, который использует адаптер и отображает изображение (путем его декодирования с использованием Bitmap.decodeFile и BitMap.Options, чтобы сопоставить его с размером ImageView).

Проблема заключается в том, что это декодирование с помощью адаптера принимаетдолгое время, и мой пользовательский интерфейс страдает отставание, «серьезное» отставание, как 3 секунды.Мне нужна помощь в его оптимизации.

Я делаю это в Kotlin, и мой класс OptimiseImage выглядит следующим образом (за ним следует мой метод getView из класса Adapter):

    class OptimiseImage {
    companion object {
        fun getBitmap (iView: ImageView, imagePath: String):Bitmap {
            // Get the dimensions of the View
            val targetW = iView.getWidth()
            val targetH = iView.getHeight()

            // Get the dimensions of the bitmap
            val bmOptions = BitmapFactory.Options() // Returns Option Object
            bmOptions.inJustDecodeBounds = true // So it does not run out of memory if image is big
            BitmapFactory.decodeFile(imagePath, bmOptions) // But can still query the size of the image
            val photoW = bmOptions.outWidth
            val photoH = bmOptions.outHeight

            // Determine how much to scale down the image
            // Return the lowest out of the two based on photo orientation
            val scaleFactor = Math.min(photoW / targetW, photoH / targetH)

            // Decode the image file into a Bitmap sized to fill the View
            bmOptions.inJustDecodeBounds = false
            bmOptions.inSampleSize = scaleFactor

            return BitmapFactory.decodeFile(imagePath, bmOptions)
        }

        fun getBitmap(height:Int, width:Int, imagePath: String):Bitmap {
            // Get the dimensions of the View
            val targetW = width
            val targetH = height

            // Get the dimensions of the bitmap
            val bmOptions = BitmapFactory.Options() // Returns Option Object
            bmOptions.inJustDecodeBounds = true // So it does not run out of memory if image is big
            BitmapFactory.decodeFile(imagePath, bmOptions) // But can still query the size of the image
            val photoW = bmOptions.outWidth
            val photoH = bmOptions.outHeight

            // Determine how much to scale down the image
            // Return the lowest out of the two based on photo orientation
            val scaleFactor = Math.min(photoW / targetW, photoH / targetH)

            // Decode the image file into a Bitmap sized to fill the View
            bmOptions.inJustDecodeBounds = false
            bmOptions.inSampleSize = scaleFactor

            return BitmapFactory.decodeFile(imagePath, bmOptions)
        }
    }
}

Any myМетод getView следующий:

   override fun getView(i: Int, convertView: View?, viewGroup: ViewGroup): View {
    Log.d(TAG,"In getView")
    var cView = convertView
    val (_, name, company, _, imagePath) = mSitesData[i]

    if (convertView == null) {
        val layoutInflater = LayoutInflater.from(context)
        cView = layoutInflater.inflate(R.layout.sites_grid_layout, null)
    }
    val iView = cView!!.findViewById(R.id.imageview_cover_art) as ImageView
    val siteName = cView.findViewById(R.id.site_name) as TextView
    val siteCompany = cView.findViewById(R.id.company_name) as TextView

    if (imagePath.equals("")){
        iView.setImageResource(R.drawable.camera_item)
    } else {
        val image = OptimiseImage.getBitmap(165,165,imagePath) //How to avoid this slowing down the UI?
        iView.setImageBitmap(image)
    }
    Log.d(TAG,"Out of GetView")
    siteName.text = name
    siteCompany.text = company
    return cView
}
...