我有一个缓慢的启动和黑屏的问题,当获取联系人信息到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()
}
}
1条答案
按热度按时间h4cxqtbf1#
您的代码中有两个主要问题:
1.您可能正在UI线程上运行上述查询,这会阻塞整个手机,直到查询完成加载,这真的是很糟糕的用户体验。
1.您的代码运行一个查询来获取所有联系人,然后每个联系人运行更多查询**,这意味着如果您的用户有5000个联系人,您的代码将需要执行5000个查询,这可能需要很长时间才能完成。
要修复问题#1,您应该异步调用代码,并在查询完成时更新RecyclerView,以便在屏幕上加载项目。
有很多方法可以实现这一点,简单的如
AsyncTask
,更高级的如AsyncListUtil
这里有一些资源:
问题2可以通过直接在ContactsContract.data表而不是ContactsContract.Contacts表上运行查询来修复。
数据表包含所有联系人的所有信息,因此您可以在一个大查询中获得所有需要,这比多个小查询快得多。
这里有一个关于如何做到这一点的例子:https://stackoverflow.com/a/52602698/819355