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

相关推荐
安卓开发者11 小时前
Android RxJava 组合操作符实战:优雅处理多数据源
android·rxjava
阿华的代码王国11 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
一条上岸小咸鱼11 小时前
Kotlin 基本数据类型(三):Booleans、Characters
android·前端·kotlin
Jerry说前后端11 小时前
RecyclerView 性能优化:从原理到实践的深度优化方案
android·前端·性能优化
alexhilton12 小时前
深入浅出着色器:极坐标系与炫酷环形进度条
android·kotlin·android jetpack
一条上岸小咸鱼18 小时前
Kotlin 基本数据类型(一):Numbers
android·前端·kotlin
Huntto18 小时前
最小二乘法计算触摸事件速度
android·最小二乘法·触摸事件·速度估计
一笑的小酒馆18 小时前
Android中使用Compose实现各种样式Dialog
android
红橙Darren18 小时前
手写操作系统 - 编译链接与运行
android·ios·客户端
鹏多多.1 天前
flutter-使用device_info_plus获取手机设备信息完整指南
android·前端·flutter·ios·数据分析·前端框架