#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, чтобы устранить эти ограничения.