Android GlideApp decode file resource shared by different processes,Kotlin

Android GlideApp decode file resource shared by different processes,Kotlin

Kotlin 复制代码
import android.content.Context
import android.os.Environment
import android.util.Log
import com.bumptech.glide.GlideBuilder
import com.bumptech.glide.annotation.GlideModule
import com.bumptech.glide.load.engine.cache.DiskLruCacheFactory
import com.bumptech.glide.module.AppGlideModule
import java.io.File


@GlideModule
class MyGlideModule : AppGlideModule() {

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

        builder.setLogLevel(Log.DEBUG)

        val diskCacheFolder = Environment.getExternalStorageDirectory()
        val diskCacheName = "fly_disk_cache" //实际场景在前面加一个 . 变成这样 .fly_disk_cache ,对用户隐藏缓存目录。
        val diskCacheSize: Long = 1024 * 1024 * 2048L

        val cacheFolder = File(diskCacheFolder, diskCacheName)
        if (cacheFolder.exists()) {
            Log.d("fly", "${cacheFolder.absolutePath} exists")
        } else {
            if (cacheFolder.mkdir()) {
                Log.d("fly", "${cacheFolder.absolutePath} create OK")
            }
        }

        val diskLruCacheFactory = DiskLruCacheFactory(diskCacheFolder.absolutePath, diskCacheName, diskCacheSize)
        builder.setDiskCache(diskLruCacheFactory)
    }

    override fun isManifestParsingEnabled(): Boolean {
        return false
    }
}
Kotlin 复制代码
import android.content.Context
import android.os.Bundle
import android.provider.MediaStore
import android.text.TextUtils
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.text.SimpleDateFormat


class MainActivity : AppCompatActivity() {
    companion object {
        const val SIZE = 400
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val ctx = applicationContext
        lifecycleScope.launch(Dispatchers.IO) {
            val lists = readAllImage(this@MainActivity)
            lists.forEach {
                GlideApp.with(ctx)
                    .load(it.path)
                    .fitCenter()
                    .override(SIZE)
                    .submit(SIZE, SIZE)
                    .get()
            }
        }
    }

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

        //读取所有图
        val cursor = context.contentResolver.query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null
        )

        var index = 0
        val sdf = SimpleDateFormat("yyyy-MM-dd")
        while (cursor!!.moveToNext()) {
            //路径 uri
            val path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA))
            if (TextUtils.isEmpty(path)) {
                continue
            }

            val dateModified = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATE_MODIFIED))

            //图片名称
            //val name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME))
            //图片大小
            //val size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.SIZE))

            val dateStr = sdf.format(dateModified?.toLong()!! * 1000)

            val data = MyData()
            data.path = path
            data.dateModified = dateModified.toLong()
            data.dateString = dateStr
            data.index = index++

            photos.add(data)
        }
        cursor.close()

        return photos
    }

    class MyData {
        var dateModified: Long? = 0L
        var dateString: String? = null
        var path: String? = null
        var index: Int? = null
    }
}

依赖问题:目标是把设备上的全部图资源先解码放好,备着后续使用,但由于Glide的加载器启动一个decode任务依赖activity的生命周期,当把activity切入后台后,之前启动的任务加载完后,就暂停了。理想的情况是让Glide在后台一直静默decode原始图文件,不依赖/不去感知activity的生命周期变化。因为有的场景只是在后台起了一个service,没有前台界面,静默decode图。

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

相关推荐
三少爷的鞋2 小时前
Android 协程实践:为什么不应将 `supervisorScope` 作为常规方案
android
承渊政道3 小时前
【从零开始大模型开发与微调:基于PyTorch与ChatGLM】(从ChatGLM本地化到LoRA、PEFT的高级微调)
android·人工智能·pytorch·chatglm·本地化部署·大模型开发与微调
倚楼听风语4 小时前
Kotlin 协程与 suspend 原理详解
java·算法·kotlin
2601_962885725 小时前
如何用 Python 判断一只股票“追涨”还是“抄底”更有效?
android·开发语言·python
素师良码5 小时前
第10篇:屏ESD Check内核逻辑驱动代码完整拆解
android
高晶5 小时前
Android 短信收发模块从零到实战:权限配置、界面设计、发送接收与兼容性适配全攻略
android·程序员
随遇丿而安5 小时前
第18周:ViewModel 基础功能 + 架构优化
android
问心无愧05138 小时前
[GXYCTF2019]Ping Ping Ping
android·笔记
事圆则缓9 小时前
Kotlin 集合与序列:给页面一份清楚的数据
开发语言·windows·kotlin
事圆则缓9 小时前
Kotlin 异步与并发:从一次搜索请求走到状态流
android·开发语言·kotlin