从SQL数据库删除数据会导致部分应用停止加载?

时间:2017-12-01 14:53:49

标签: android

我正在开发一个短信应用程序,并遇到了一个奇怪的问题,我已经尝试了很长时间来修复,但不能这样,我想知道是否有一些事情发生在我之上。

为了解释这个场景,我的应用程序类如下:

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方法

为了阻止这种情况,我从静态内存缓存更改为使用单例,但这没有帮助。有什么想法吗?

0 个答案:

没有答案