Есть ли в Android ограничение на количество адресов электронной почты от контактов, которые я могу получить?

#android #autocomplete

#Android #автозаполнение

Вопрос:

Я создаю приложение для Android, в котором, когда пользователь начинает вводить адрес электронной почты, он получает предложения по автозаполнению из своей телефонной контактной книги.

Если я установлю ограничение для своего кода, чтобы получать только 100 адресов, он отлично работает. Если я не устанавливаю никаких ограничений, приложение зависает. Я не пытался установить более высокий предел и посмотреть, и в какой момент он сдается.

Как я могу оптимизировать свой код?

     private ArrayList<String> getNameEmailDetails() {
    ArrayList<String> emlRecs = new ArrayList<String>();
    **int count = 0;** // THIS IS ADDITIONAL

    HashSet<String> emlRecsHS = new HashSet<String>();
    Context context = getBaseContext();
    ContentResolver cr = context.getContentResolver();
    String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID, 
            ContactsContract.Contacts.DISPLAY_NAME,
            ContactsContract.Contacts.PHOTO_ID,
            ContactsContract.CommonDataKinds.Email.DATA, 
            ContactsContract.CommonDataKinds.Photo.CONTACT_ID };
    String order = "CASE WHEN " 
              ContactsContract.Contacts.DISPLAY_NAME 
              " NOT LIKE '%@%' THEN 1 ELSE 2 END, " 
              ContactsContract.Contacts.DISPLAY_NAME 
              ", " 
              ContactsContract.CommonDataKinds.Email.DATA
              " COLLATE NOCASE";
    String filter = ContactsContract.CommonDataKinds.Email.DATA   " NOT LIKE ''";
    Cursor cur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, filter, null, order);
    if (cur.moveToFirst()) {
        do {
            String emlAddr = cur.getString(3);

            // keep unique only
            if (emlRecsHS.add(emlAddr.toLowerCase())) {
                emlRecs.add(emlAddr);
                **count  ;** // THIS IS ADDITIONAL
            }
        } while (cur.moveToNext() **amp;amp; count < 100**);
    }

    cur.close();
    return emlRecs;
}
  

Ответ №1:

Ваше приложение «зависает», потому что вы выполняете длительные или сложные вычисления в потоке пользовательского интерфейса. Это поток, отвечающий за отображение представлений вашего приложения и реагирование на вводимые пользователем данные.

Вы должны перемещать подобные запросы (как и при любой сетевой активности) в другой поток, чтобы ваше приложение не перестало отвечать на запросы.

Посмотрите в Threads или AsyncTask, чтобы устранить эти ограничения.