Android GlideApp GlideRequest FixedPreloadSizeProvider RecyclerViewPreloader,kotlin

Android GlideApp GlideRequest FixedPreloadSizeProvider RecyclerViewPreloader,kotlin

glide preload image into memory work

    
    

    implementation 'com.github.bumptech.glide:glide:4.15.1'
    kapt 'com.github.bumptech.glide:compiler:4.15.1'
    implementation ("com.github.bumptech.glide:recyclerview-integration:4.14.2") {
        // Excludes the support library because it's already included by Glide.
        transitive = false
    }

import android.content.Context
import android.graphics.Bitmap
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.ListPreloader
import com.bumptech.glide.RequestBuilder
import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader
import com.bumptech.glide.util.FixedPreloadSizeProvider
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.io.File


class MainActivity : AppCompatActivity() {
    companion object {
        const val TAG = "Glide"
        fun dip2px(dpValue: Int, res: android.content.res.Resources): Int {
            val scale = res.displayMetrics.density
            return (dpValue * scale + 0.5f).toInt()
        }

        const val PHOTO_SIZE: Int = 100
    }

    private var mGlideRequest: GlideRequest? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mGlideRequest = GlideApp
            .with(this)
            .asBitmap()
            .centerCrop()
            .override(dip2px(PHOTO_SIZE, resources))

        rvPreload()
    }

    private fun rvPreload() {
        val spanCount = 3

        var recyclerView: RecyclerView = findViewById(R.id.recycler_view)
        recyclerView?.layoutManager = GridLayoutManager(this, spanCount).apply {
            orientation = GridLayoutManager.VERTICAL
        }

        val adapter = MyAdapter(mGlideRequest, this)
        recyclerView?.adapter = adapter

        CoroutineScope(Dispatchers.IO).launch {
            val items = readAllImage(applicationContext)

            withContext(Dispatchers.Main) {
                adapter.onChange(items)
            }
        }

        val photoSize = dip2px(PHOTO_SIZE, application.resources)
        val heightCount: Int = resources.displayMetrics.heightPixels / photoSize
        val loadSize = spanCount * heightCount * 20
        Log.d(TAG, "加载量:$loadSize")

        val preloadSizeProvider = FixedPreloadSizeProvider(
            dip2px(PHOTO_SIZE, resources),
            dip2px(PHOTO_SIZE, resources)
        )
        val preloadModelProvider = MyPreloadModelProvider(adapter, mGlideRequest)
        val preloader: RecyclerViewPreloader = RecyclerViewPreloader(
            GlideApp.with(this),
            preloadModelProvider,
            preloadSizeProvider,
            loadSize
        )

        recyclerView?.addOnScrollListener(preloader)
    }

    class MyPreloadModelProvider(
        private val adapter: MyAdapter,
        private val request: GlideRequest?
    ) : ListPreloader.PreloadModelProvider {
        override fun getPreloadItems(position: Int): MutableList {
            MyModule.debug(
                "getPreloadItems pos:$position ${
                    adapter.getItems()?.get(position)?.path
                }"
            )
            return mutableListOf(adapter.getItems()?.get(position)!!)
        }

        override fun getPreloadRequestBuilder(item: MyData): RequestBuilder? {
            MyModule.debug("getPreloadRequestBuilder item:${item.index} ${item.path}")
            return request?.load(File(item.path))
        }
    }

    class MyAdapter(private val request: GlideRequest?, private val ctx: Context) :
        RecyclerView.Adapter() {
        private var items: MutableList? = null

        fun onChange(items: MutableList) {
            this.items = items
            notifyDataSetChanged()
        }

        fun getItems(): MutableList {
            return items!!
        }

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
            val view = LayoutInflater.from(ctx)
                .inflate(R.layout.item, parent, false)
            val params = view.layoutParams
            params.width = dip2px(PHOTO_SIZE, ctx.resources)
            params.height = dip2px(PHOTO_SIZE, ctx.resources)
            return MyViewHolder(view)
        }

        override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
            request?.load(File(items?.get(position)?.path))?.into(holder.image)
            holder.text.text = "$position"
            MyModule.debug("onBindViewHolder $position")
        }

        override fun getItemCount(): Int {
            return items?.size ?: 0
        }
    }

    class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val image: ImageView = itemView.findViewById(R.id.image)
        val text: TextView = itemView.findViewById(R.id.text)
    }

    private fun readAllImage(context: Context): ArrayList {
        val photos = ArrayList()

        //读取手机图片
        val cursor = context.contentResolver.query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            null,
            null,
            null,
            null
        )
        var index = 0
        while (cursor!!.moveToNext()) {
            //图片路径 uri
            val path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA))

            //图片名称
            //val name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME))

            //图片大小
            //val size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.SIZE))

            photos.add(MyData(path, index++))
        }
        cursor.close()

        return photos
    }

    class MyData(var path: String, val index: Int)
}




    




    

    

import android.content.Context
import android.util.Log
import com.bumptech.glide.GlideBuilder
import com.bumptech.glide.annotation.GlideModule
import com.bumptech.glide.load.engine.cache.LruResourceCache
import com.bumptech.glide.module.AppGlideModule


@GlideModule
class MyModule : AppGlideModule() {
    companion object {
        const val TAG = MainActivity.TAG
        val mLruResourceCache = LruResourceCache(1024 * 1024 * 9999)

        fun debug(msg: String) {
            Log.d(
                TAG,
                "${mLruResourceCache.currentSize} $msg"
            )
        }
    }


    override fun applyOptions(context: Context, builder: GlideBuilder) {
        super.applyOptions(context, builder)

        /**
        根据屏幕大小自动获取合适的缓存大小
        MemorySizeCalculator calculator=new MemorySizeCalculator.Builder(context)
        //默认值是2
        .setMemoryCacheScreens(2)
        .build();
        //使用Lru缓存策略
        builder.setMemoryCache(new LruResourceCache(calculator.getMemoryCacheSize()))
         */

        //builder.setMemoryCache(mLruResourceCache)
        builder.setLogLevel(Log.DEBUG)
        Log.d(TAG, "自定义配置")
    }

    override fun isManifestParsingEnabled(): Boolean {
        return false
    }
}

Android Glide预加载RecyclerViewPreloader,ViewPreloadSizeProvider,kotlin_zhangphil的博客-CSDN博客【代码】Android Paging 3,kotlin(1)在实际的开发中,虽然Glide解决了快速加载图片的问题,但还有一个问题悬而未决:比如用户的头像,往往用户的头像是从服务器端读出的一个普通矩形图片,但是现在的设计一般要求在APP端的用户头像显示成圆形头像,那么此时虽然Glide可以加载,但加载出来的是一个矩形,如果要Glide_android 毛玻璃圆角。《Android图片加载与缓存开源框架:Android Glide》Android Glide是一个开源的图片加载和缓存处理的第三方框架。https://blog.csdn.net/zhangphil/article/details/131597104

Android Glide onlyRetrieveFromCache downloadOnly submit ,kotlin_zhangphil的博客-CSDN博客【代码】Android Paging 3,kotlin(1)在实际的开发中,虽然Glide解决了快速加载图片的问题,但还有一个问题悬而未决:比如用户的头像,往往用户的头像是从服务器端读出的一个普通矩形图片,但是现在的设计一般要求在APP端的用户头像显示成圆形头像,那么此时虽然Glide可以加载,但加载出来的是一个矩形,如果要Glide_android 毛玻璃圆角。《Android图片加载与缓存开源框架:Android Glide》Android Glide是一个开源的图片加载和缓存处理的第三方框架。https://blog.csdn.net/zhangphil/article/details/131774130Android Glide同步阻塞方式submit获得Bitmap,kotlin_zhangphil的博客-CSDN博客【代码】Android Paging 3,kotlin(1)在实际的开发中,虽然Glide解决了快速加载图片的问题,但还有一个问题悬而未决:比如用户的头像,往往用户的头像是从服务器端读出的一个普通矩形图片,但是现在的设计一般要求在APP端的用户头像显示成圆形头像,那么此时虽然Glide可以加载,但加载出来的是一个矩形,如果要Glide_android 毛玻璃圆角。《Android图片加载与缓存开源框架:Android Glide》Android Glide是一个开源的图片加载和缓存处理的第三方框架。https://blog.csdn.net/zhangphil/article/details/131641086Android Glide预加载preload ,kotlin_zhangphil的博客-CSDN博客【代码】Android Paging 3,kotlin(1)在实际的开发中,虽然Glide解决了快速加载图片的问题,但还有一个问题悬而未决:比如用户的头像,往往用户的头像是从服务器端读出的一个普通矩形图片,但是现在的设计一般要求在APP端的用户头像显示成圆形头像,那么此时虽然Glide可以加载,但加载出来的是一个矩形,如果要Glide_android 毛玻璃圆角。《Android图片加载与缓存开源框架:Android Glide》Android Glide是一个开源的图片加载和缓存处理的第三方框架。https://blog.csdn.net/zhangphil/article/details/131635804Android Glide自定义AppGlideModule,让Glide在app启动后基于定制化GlideModule加载,kotlin_zhangphil的博客-CSDN博客在实际的开发中,虽然Glide解决了快速加载图片的问题,但还有一个问题悬而未决:比如用户的头像,往往用户的头像是从服务器端读出的一个普通矩形图片,但是现在的设计一般要求在APP端的用户头像显示成圆形头像,那么此时虽然Glide可以加载,但加载出来的是一个矩形,如果要Glide_android 毛玻璃圆角。《Android图片加载与缓存开源框架:Android Glide》Android Glide是一个开源的图片加载和缓存处理的第三方框架。https://blog.csdn.net/zhangphil/article/details/131592226

你可能感兴趣的:(Android,kotlin,android,kotlin)