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图。