kotlin 启动应用程序时黑屏和启动缓慢,当将联系人信息导入RecyclerView时?

r3i60tvu  于 2023-04-07  发布在  Kotlin
关注(0)|答案(1)|浏览(169)

我有一个缓慢的启动和黑屏的问题,当获取联系人信息到RecyclerView.而且,删除过程时,问题消失了.下面是getContacts的功能,如果有人可以帮助.谢谢你...

private fun getContactList() {
        val uri: Uri = ContactsContract.Contacts.CONTENT_URI
        // Sort by ascending
        val sort: String = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME+" ASC"
        // Initialize Cursor
        val cursor: Cursor = requireActivity().contentResolver.query(uri, null, null, null, sort)!!
        // Check condition
        if (cursor.count > 0) {
            while (cursor.moveToNext()) {
                val id: String = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID))
                val name: String = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME))
                val img: String = getPhotoUriFromID(id).toString()
                val phoneUri: Uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI
                val selection: String = ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" =?"
                // Initialize phone cursor
                val phoneCursor: Cursor = requireActivity().contentResolver.query(phoneUri, null, selection,
                    arrayOf(id), null)!!
                // Check condition
                if (phoneCursor.moveToNext()) {
                    val number: String = phoneCursor.getString(phoneCursor
                        .getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER))
                    // Initialize Contact Model
                    val model = ContactModel(name, number, img)
                    contactArr.add(model)
                    groupListAdapter.notifyDataSetChanged()
                    // Close Phone Cursor
                    phoneCursor.close()
                }
            }
            // Close Cursor
            cursor.close()
        }
    }
h4cxqtbf

h4cxqtbf1#

您的代码中有两个主要问题:
1.您可能正在UI线程上运行上述查询,这会阻塞整个手机,直到查询完成加载,这真的是很糟糕的用户体验。
1.您的代码运行一个查询来获取所有联系人,然后每个联系人运行更多查询**,这意味着如果您的用户有5000个联系人,您的代码将需要执行5000个查询,这可能需要很长时间才能完成。
要修复问题#1,您应该异步调用代码,并在查询完成时更新RecyclerView,以便在屏幕上加载项目。
有很多方法可以实现这一点,简单的如AsyncTask,更高级的如AsyncListUtil
这里有一些资源:

  1. https://androidwave.com/implementation-of-recyclerview-with-cursor-adapter/
  2. https://medium.com/android-news/how-to-use-asynclistutil-16b5175bb468
    问题2可以通过直接在ContactsContract.data表而不是ContactsContract.Contacts表上运行查询来修复。
    数据表包含所有联系人的所有信息,因此您可以在一个大查询中获得所有需要,这比多个小查询快得多。
    这里有一个关于如何做到这一点的例子:https://stackoverflow.com/a/52602698/819355

相关问题