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

相关推荐
zhaoyufei1338 小时前
Android13删除Taskbar
android
G_dou_9 小时前
KMP & OpenHarmony 实现二分查找
kotlin·鸿蒙
6***B4810 小时前
存储过程(SQL)
android·数据库·sql
学困昇11 小时前
C++中的异常
android·java·c++
Jerry12 小时前
问题记录 - Android IdleHandler 没有执行
android
没有了遇见12 小时前
Android ButterKnife Android 35情况下 适配 Gradle 8.+
android
方白羽12 小时前
Android多层嵌套RecyclerView滚动
android·java·kotlin
菜就多学13 小时前
SurfaceControlViewHost 实现跨进程UI渲染
android·设计
2501_9151063214 小时前
iOS App 测试工具全景分析,构建从开发调试到线上监控的多阶段工具链体系
android·测试工具·ios·小程序·uni-app·iphone·webview
小羊在奋斗15 小时前
MySQL表的约束:从基础到核心(附场景+案例)
android·数据库·mysql