Carregando contatos apenas com e-mail, nome e tipo usando LoaderManager

Feb 13 2023
Estou trabalhando na refatoração do código legado para atender aos padrões de codificação do mercado de maneira simples. Eu li alguns artigos para conhecer os métodos recentes disponíveis do SDK para obter todos os contatos.

Estou trabalhando na refatoração do código legado para atender aos padrões de codificação do mercado de maneira simples.

Eu li alguns artigos para conhecer os métodos recentes disponíveis do SDK para obter todos os contatos. Encontrei algumas maneiras de obter todos os contatos do dispositivo. Há muita demora em conseguir os contatos. No meu caso, os contatos do meu dispositivo são 664, o que levou cerca de 4 a 7 segundos. Podemos lidar com esse atraso usando uma barra de progresso ocupando/bloqueando o usuário. Nesta era, como a maior parte da manipulação de dados é feita em multitarefa, bloquear o usuário não é a melhor UX para o usuário.

Portanto, a única maneira de fazer algo aqui é carregar contatos no thread de segundo plano usando viewmodelscope/coroutines/rxjava e assim por diante….

Eu não sabia que existe uma maneira simples de obter todos os contatos em menos tempo, mas existe uma.

eu dependo dessas coisas

  1. LoaderManager
  2. LoaderManager.LoaderCallbacks<Cursor>
  3. CursorLoader
  4. Nomes de colunas que queremos
  1. onCreateLoader é o primeiro retorno de chamada a ser executado, no qual escreveremos a consulta para obter todos os contatos com nomes de coluna necessários.
  2. Estou usando o cursorLoader para executar uma consulta como esta
  3. CursorLoader(
        requireActivity(),
        ContactsContract.CommonDataKinds.Email.CONTENT_URI,
        arrayOf(
            ContactsContract.CommonDataKinds.Email.CONTACT_ID,
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Email.DATA,
            ContactsContract.CommonDataKinds.Email.TYPE
        ),
        null,
        null,
        null
    )
    

    private fun loadContacts() {
        // Request permission to read contacts. When approved, swap frag with email contacts list frag
        if (ContextCompat.checkSelfPermission(
                requireContext(),
                Manifest.permission.READ_CONTACTS
            ) != PackageManager.PERMISSION_GRANTED
        ) {
            requestReadContacts.launch(arrayOf(Manifest.permission.READ_CONTACTS))
        } else
            LoaderManager.getInstance(this).initLoader(0, null, this)
    }
    

É isso, o próximo trabalho é analisar os dados para nossas classes de dados/classes pojo e preparar uma lista.