Android:Execute um thread em segundo plano sem atrasar a atividade
-
21-12-2019 - |
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:
- Como posso executar isso em seu próprio thread para não atrasar a atividade de desenho na tela
- 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.
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