Android:Запустите поток в фоновом режиме, не задерживая действие
-
21-12-2019 - |
Вопрос
У меня есть процесс, который извлекает контактную информацию, и это занимает много времени - 4 секунды.Я не хочу, чтобы это мешало работе пользователя в моем приложении.У меня есть 2 вопроса:
- Как я могу запустить это в своем собственном потоке, чтобы это не задерживало действие от рисования на экране
- Есть ли способ ускорить это?(Делаю ли я это неэффективно?)
Я пробовал вызывать метод getContacts (), приведенный ниже, из onCreate, из OnStart и onResume, но во всех случаях экран не появляется до тех пор, пока метод не будет запущен полностью.
Вот код:
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();
}
Примечание:Я знаю о главной причине, по которой этот процесс идет медленно - я преобразую результат работы курсора в ArrayList < Список массивов < String>> а затем вставить его в базу данных SQLite.Но если бы я мог заставить это работать в фоновом режиме, я был бы счастлив.
Решение
Рассмотрите возможность использования daemon
Нитки.
Daemon
потоки обычно используются для выполнения служб для вашего приложения / апплета (таких как загрузка "бит скрипки").Основное различие между пользовательскими потоками и потоками демонов заключается в том, что JVM завершает работу программы только тогда, когда все пользовательские потоки завершены.Потоки демона завершаются JVM, когда больше не выполняются пользовательские потоки, включая основной поток выполнения.
P.S.Это поток с низким приоритетом
Источники:
Пример
Thread thread = new Thread();
thread.setDaemon(true);
thread.start();
РЕДАКТИРОВАТЬ!
Посмотри на это Ссылка для AsyncTask
который является потоком для фоновых задач пользовательского интерфейса.
Другие советы
Рассмотреть возможность использования курсорного загрузчика, который загружает данные из ContentProvider в фоновом потоке: Список контактов