我正在开发一个短信应用程序,并遇到了一个奇怪的问题,我已经尝试了很长时间来修复,但不能这样,我想知道是否有一些事情发生在我之上。
为了解释这个场景,我的应用程序类如下:
class Texpert : Application() {
override fun onCreate() {
super.onCreate()
setupDebugNotification(applicationContext)
database = MessagesDatabase(applicationContext)
}
companion object {
lateinit var database: MessagesDatabase
var cache: LruCache<String, Bitmap>? = null
val memoryCache: LruCache<String, Bitmap>
get() {
if (cache != null)
return cache!!
return synchronized(this) {
val cacheSize = (Runtime.getRuntime().maxMemory() / 1024).toInt() / 8
cache = object : LruCache<String, Bitmap>(cacheSize) {
override fun sizeOf(key: String, bitmap: Bitmap): Int = bitmap.byteCount / 1024
}
cache!!
}
}
}
}
这很好用,除非用户在收件箱中并删除对话(我从系统消息数据库和我的应用程序数据库“MessagesDatabase”中删除该对话)我的recyclerview内用户的联系人图片停止更新(如果图像可用,则使用memoryCache通过异步任务填充它们)并且不要将冻结更新为删除发生之前可见的冻结。
例如要明确:
删除前:
人A - 图片A 人B - 图片B 人C - 图片C ... 人M - 图片M
然后在删除期间:
人A - 图片A 人B - 图片B 但如果我向下滚动 人M - 图片A 人N - 图片B
以下是显示对话照片的功能:
fun getConversationPhoto(context: Context, cache: LruCache<String, Bitmap>?, contactPreferences: SharedPreferences, address: String): Bitmap? {
if (address.contains(","))
return getGroupPhoto(context, cache, contactPreferences, address)
if (cache != null) {
val cached = cache.get(address)
if (cached != null)
return cached
}
var photo = openSmallPhoto(context, address)
if (photo == null)
photo = getLetter(context, contactPreferences, address)
cache?.put(PhoneUtility.formatPhoneNumber(address), photo)
return photo
}
这是适配器绑定功能(对于项目视图类型,1是单个,2是组convo):
override fun onBindViewHolder(holder: ConversationViewHolder, position: Int) {
if (inbox.isClosed)
return
inbox.moveToPosition(position)
val thread = inbox.getString(threadId)
normal?.applyTo(holder.layout)
val contactColor: Int
holder.time.text = DateUtility.getTimeOfDay(inbox.getLong(date))
when (getItemViewType(position)) {
2 -> {
val prev = holder.card.tag as AsyncTask<*, *, *>?
if (prev != null && prev.status != AsyncTask.Status.FINISHED)
prev.cancel(true)
holder.card.tag = BitmapLoaderTask(context, memoryCache, contactPreferences, holder.profile).execute(inbox.getString(groupAddress))
holder.name.text = contactPreferences.getString(ContactUtility.getGroupIdentifier(inbox.getString(groupAddress)), inbox.getString(groupName))
contactColor = ColorUtility.getAppColor(context)
}
else -> {
BitmapLoaderTask(context, memoryCache, contactPreferences, holder.profile).execute(inbox.getString(address))
holder.name.text = ContactUtility.getName(context, inbox.getString(address))
contactColor = ColorUtility.getNameColor(context.resources, contactPreferences, inbox.getString(address), inbox.getString(name))
}
}
}
位图异步任务只调用上面显示的getConversationPhoto方法
为了阻止这种情况,我从静态内存缓存更改为使用单例,但这没有帮助。有什么想法吗?