Android:Запустите поток в фоновом режиме, не задерживая действие

StackOverflow https://stackoverflow.com//questions/24023098

Вопрос

У меня есть процесс, который извлекает контактную информацию, и это занимает много времени - 4 секунды.Я не хочу, чтобы это мешало работе пользователя в моем приложении.У меня есть 2 вопроса:

  1. Как я могу запустить это в своем собственном потоке, чтобы это не задерживало действие от рисования на экране
  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 в фоновом потоке: Список контактов

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top