Pergunta

Eu tenho um processo que extrai informações de contato e leva muito tempo - 4 segundos.Não quero que isso interfira na experiência do usuário em meu aplicativo.Eu tenho 2 perguntas:

  1. Como posso executar isso em seu próprio thread para não atrasar a atividade de desenho na tela
  2. Existe uma maneira de acelerar isso?(Estou fazendo isso de forma ineficiente?)

Tentei chamar o método getContacts() abaixo de onCreate, de onStart e onResume, mas em todos os casos a tela não aparece até que o método tenha sido executado completamente.

Aqui está o código:

private void getContacts() {
    Thread thread = new Thread() {
        @Override
        public void run() {
            try {
                Log.d("ManageFriends","getContacts Start");
                ContentResolver cr = getContentResolver();
                String[] PROJECTION = new String[] {
                        ContactsContract.CommonDataKinds.Email.CONTACT_ID,
                        ContactsContract.Contacts.DISPLAY_NAME,
                        ContactsContract.CommonDataKinds.Email.ADDRESS,
                        ContactsContract.CommonDataKinds.Email.IS_PRIMARY,
                };
                String filter = ContactsContract.CommonDataKinds.Email.ADDRESS + " NOT LIKE '' AND 1 == " +
                        ContactsContract.Contacts.IN_VISIBLE_GROUP + " AND " +
                        ContactsContract.Contacts.DISPLAY_NAME + " NOT LIKE '%@%'";
                Cursor cur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, filter, null, null);
                DBHelper.insertArrayList(db,"Contacts",DBHelper.cursorToArrayList(cur));
                Log.d("ManageFriends","getContacts End");
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
    thread.run();
}

Observação:Estou ciente do grande motivo pelo qual esse processo é lento - estou convertendo o resultado do cursor em um ArrayList <ArrayList <String>> e, em seguida, inserindo-o em um banco de dados SQLite.Mas se eu conseguisse fazê-lo funcionar em segundo plano, ficaria feliz.

Foi útil?

Solução

Considere usar um daemon fio.

Daemon threads são normalmente usados ​​para executar serviços para seu aplicativo/applet (como carregar os "bits complicados").A principal diferença entre threads de usuário e threads daemon é que a JVM só encerrará um programa quando todos os threads de usuário forem encerrados.Threads daemon são encerrados pela JVM quando não há mais threads de usuário em execução, incluindo o thread principal de execução.

P.S.É um thread de baixa prioridade

Fontes:

Exemplo

Thread thread = new Thread();

thread.setDaemon(true);

thread.start();

EDITAR!

Veja isso link para AsyncTask que é um thread para tarefas em segundo plano da UI.

Outras dicas

Considere o uso do cursorloader que carrega dados do contentprovider no thread de fundo: recuperandoUma lista de contatos

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top