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

相关推荐
货拉拉技术3 小时前
记一次无障碍测试引发app崩溃问题的排查与解决
android·前端·程序员
GrimRaider3 小时前
【逆向工程】破解unity的安卓apk包
android·unity·游戏引擎·软件逆向
yzpyzp3 小时前
Jetpack之ViewBinding和DataBinding的区别
android
小墙程序员4 小时前
一文了解Android的build目录结构
android·gradle
叶落方知秋4 小时前
OkHttp 3.10.0版本源码之重试重定向拦截器原理分析
android·前端框架
无聊的烤苕皮4 小时前
MySQL第五次作业(触发器、存储过程)
android·mysql·adb
ianozo5 小时前
BUU34 [BSidesCF 2020]Had a bad day1 【php://filter】
android
xvch5 小时前
Kotlin 2.1.0 入门教程(十三)异常、Nothing
android·kotlin
深色風信子5 小时前
Kotlin Bytedeco OpenCV 图像图像51.1 KNN背景消除
opencv·kotlin·bytedeco·knn背景消除·背景消除
陈老师还在写代码6 小时前
安卓开发用Java、Flutter、Kotlin的区别
android·java·flutter