您的位置:首页 > 娱乐 > 八卦 > 电子工程网_网站源码在线查询_拓客软件_电工培训内容

电子工程网_网站源码在线查询_拓客软件_电工培训内容

2025/3/1 1:28:43 来源:https://blog.csdn.net/zhangphil/article/details/145708017  浏览:    关键词:电子工程网_网站源码在线查询_拓客软件_电工培训内容
电子工程网_网站源码在线查询_拓客软件_电工培训内容

Android Coil 3 ImageLoader MemoryCache根据Key复用内存缓存,Kotlin

 

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

 

 

    implementation("io.coil-kt.coil3:coil:3.1.0")implementation("io.coil-kt.coil3:coil-network-okhttp:3.1.0")

或者:

    implementation("io.coil-kt.coil3:coil-core:3.1.0")implementation("io.coil-kt.coil3:coil-network-okhttp:3.1.0")

如果app过大,使用的loader需要自己管理和维护。

 

 

import android.content.ContentUris
import android.content.Context
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launchclass MainActivity : AppCompatActivity() {companion object {const val TAG = "fly"const val SPAN_COUNT = 8}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val rv = findViewById<RecyclerView>(R.id.rv)val layoutManager = GridLayoutManager(this, SPAN_COUNT)layoutManager.orientation = LinearLayoutManager.VERTICALval adapter = ImageAdapter(this, 0)rv.adapter = adapterrv.layoutManager = layoutManagerval ctx = thislifecycleScope.launch(Dispatchers.IO) {val lists = readAllImage(ctx)Log.d(TAG, "readAllImage size=${lists.size}")lifecycleScope.launch(Dispatchers.Main) {adapter.dataChanged(lists)}}}class MyData(var path: String, var uri: Uri)private fun readAllImage(ctx: Context): ArrayList<MyData> {val photos = ArrayList<MyData>()//读取所有图val cursor = ctx.contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null)while (cursor!!.moveToNext()) {//路径val path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA))val id = cursor.getColumnIndex(MediaStore.Images.ImageColumns._ID)val imageUri: Uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, cursor.getLong(id))//名称//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, imageUri))}cursor.close()return photos}
}

 

 

 

 

import android.content.Context
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.os.Environment
import android.util.Log
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatImageView
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import coil3.ImageLoader
import coil3.disk.DiskCache
import coil3.memory.MemoryCache
import coil3.request.CachePolicy
import coil3.request.ImageRequest
import coil3.request.bitmapConfig
import coil3.request.placeholder
import coil3.request.target
import coil3.toBitmap
import okio.Path.Companion.toPath
import java.io.Fileclass ImageAdapter : RecyclerView.Adapter<ImageHolder> {private var mCtx: Context? = nullprivate var mImageLoader: ImageLoader? = nullprivate var mViewSize = 0private var mPlaceholder: Drawable? = nullconstructor(ctx: Context, type: Int) : super() {mCtx = ctx//内存缓存。val memoryCache = MemoryCache.Builder().maxSizeBytes(1024 * 1024 * 1024 * 1L) //1GB.build()//磁盘缓存。val diskCacheFolder = Environment.getExternalStorageDirectory()val diskCacheName = "coil_disk_cache"val cacheFolder = File(diskCacheFolder, diskCacheName)if (cacheFolder.exists()) {Log.d(MainActivity.TAG, "${cacheFolder.absolutePath} exists")} else {if (cacheFolder.mkdir()) {Log.d(MainActivity.TAG, "${cacheFolder.absolutePath} create OK")} else {Log.e(MainActivity.TAG, "${cacheFolder.absolutePath} create fail")}}val diskCache = DiskCache.Builder().maxSizeBytes(1024 * 1024 * 1024 * 2L) //2GB.directory(cacheFolder.absolutePath.toPath()).build()Log.d(MainActivity.TAG, "cache folder = ${diskCache.directory.toFile().absolutePath}")//初始化加载器。mImageLoader = ImageLoader.Builder(mCtx!!).memoryCachePolicy(CachePolicy.ENABLED).memoryCache(memoryCache).diskCachePolicy(CachePolicy.ENABLED).diskCache(diskCache).bitmapConfig(Bitmap.Config.ARGB_8888).build()Log.d(MainActivity.TAG, "memoryCache.maxSize=${mImageLoader?.memoryCache?.maxSize}")mViewSize = mCtx!!.resources.displayMetrics.widthPixels / MainActivity.SPAN_COUNTmPlaceholder = ContextCompat.getDrawable(mCtx!!, R.mipmap.ic_launcher)}private var mItems = ArrayList<MainActivity.MyData>()fun dataChanged(items: ArrayList<MainActivity.MyData>) {this.mItems = itemsnotifyDataSetChanged()}override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageHolder {val view = MyIV(mCtx!!, mViewSize)return ImageHolder(view)}override fun getItemCount(): Int {return mItems.size}override fun onBindViewHolder(holder: ImageHolder, position: Int) {bind(mItems[position], holder.image)}private fun getMemoryCacheKey(data: MainActivity.MyData): MemoryCache.Key {val extras = mutableMapOf<String, String>()extras["path"] = data.pathextras["uri"] = data.uri.toString()return MemoryCache.Key(data.path, extras)}private fun bind(data: MainActivity.MyData, myIv: MyIV) {val bmp = mImageLoader?.memoryCache?.get(getMemoryCacheKey(data))?.image?.toBitmap(mViewSize, mViewSize, Bitmap.Config.ARGB_8888)if (bmp != null && bmp.byteCount > 0) {Log.d(MainActivity.TAG,"had memory cache bmp=${bmp.byteCount} ${mImageLoader?.memoryCache?.size}/${mImageLoader?.memoryCache?.maxSize}")myIv.setImageBitmap(bmp)} else {Log.d(MainActivity.TAG, "no memory cache")val memoryCacheKey = getMemoryCacheKey(data)val request = ImageRequest.Builder(mCtx!!).data(data.uri).memoryCacheKey(memoryCacheKey).diskCacheKey(memoryCacheKey.toString()).size(mViewSize).placeholder(mPlaceholder).target(myIv).build()mImageLoader?.enqueue(request)}}
}class ImageHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {var image = itemView as MyIV
}class MyIV : AppCompatImageView {private var mSize = 0constructor(ctx: Context, size: Int) : super(ctx) {mSize = sizescaleType = ScaleType.CENTER_CROP}override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {super.onMeasure(widthMeasureSpec, heightMeasureSpec)setMeasuredDimension(mSize, mSize)}
}

 

遗留问题,配置的disk cache似乎没有work,指定的磁盘缓存文件路径生成是生成了,但是app跑起来运行后(图正常显示),里面是空的。

 

 

 

 

Android Coil ImageLoader MemoryCache设置Key与复用内存缓存,Kotlin-CSDN博客文章浏览阅读183次。文章浏览阅读649次。Coil是专门针对Android平台上的Kotlin语言特性设计,这不像Glide,Glide的核心框架语言是Java。Coil实现看更细颗粒度的内存、磁盘缓存的客制化设置。扩大了内存,但跑起来发现设置后内存还是比较小(约300mb),这是不够的,需要通过其他配置方式扩大内存空间。3、app跑起来后,没有在当前app的硬盘缓存空间发现图片解码后的磁盘文件缓存痕迹。Android图片加载框架Coil,Kotlin-CSDN博客。所以干脆用协程包装起来。2、虽然通过设置内存系数。 https://blog.csdn.net/zhangphil/article/details/145685685

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com