Убийство ниток
-
28-09-2019 - |
Вопрос
Я создал класс, который является расширением нити. Этот класс попадает в веб-сервис и бросает некоторые данные на экран. Мне все равно, чтобы сохранить эти данные (экран отображает результаты поиска).
В настоящее время пользователь просто вписывается в EDITTEXT и нажимает кнопку поиска. Я хотел бы забрать кнопку поиска и реализовать что-то похожее на мгновенный поиск Google, где, как вы вводите, результаты поиска обновляются.
Это означает, что в качестве типов пользователей изменяется параметры поиска. Я хочу быть в состоянии убить текущую текущую тему (если в данный момент работает) и порождает новый с новой строкой поиска. Отказ Как это может быть достигнуто? Могу ли я сделать это с нитью или мне нужно использовать новый объект?
Решение
Это сложнее, чем просто убивать нить. Вы можете назвать прерывание () в потоке, но нить придется периодически проверять его статус прерывания и самозаверженным.
Во-вторых, вы не захотите начать нить сразу на ввод пользователя. Вы быстро сокрушите систему с резьбой нереста. Реализуйте период ожидания 100-200 миллисекунд, прежде чем выполнять поиск, чтобы вы могли быть достаточно уверены, что пользователь сделан набрав. Сервер Google может обрабатывать нагрузку, но телефон не сможет.
Редактировать: Чтобы расширить на моей первой точке, потоки могут быть сложными для отмены. В этом случае нить по электронной почте отправляет событие, чтобы как-то сообщила, что он должен остановиться. Вы можете использовать interrupt
объект, встроенный в потоки, но он имеет тенденцию быть накинутым, как указано Эта статья. Отказ Вместо этого я бы просто имел boolean
переменная, которую можно установить cancelled
каким-то внешним нитью. Хитрость (как показано в этой ссылке), будет то, что вам нужно будет периодически проверять, была ли потока отменена, и если так, вам нужно будет вручную прервать.
Следующая проблема, в которой вы столкнетесь, это если веб-вызов уже был сделан на некоторых внешних серверах. Он заблокирует в этом потоке, пока он не вернется, и нить не сможет убить себя. Это может занять несколько секунд.
Итак, давайте разыграем это - что, если пользователь набирает символ, и ваш период ожидания истекает по какой-либо причине, и веб-вызов сделан, то пользователь вносит еще один символ, когда период тайм-аута истекает так, чтобы другой веб-вызов сделан? Если ваши веб-звонки займут 5 секунд, то первый поток будет продолжать работать, даже если событие отправляет резьбу, не менее 5 секунд. Теперь у вас есть две темы, делающие веб-вызовы.
Теперь расширяйте это. Что если пользователь делает это и делает 4 или 5 потоков? Это где вы подавляете ресурсы вашего телефона. Я не говорю вам не преследовать это, просто пытаясь указать потенциальные проблемы, которые поставляются с территорией.
Другие советы
Использовать AutoCompleteTextView
виджет. Предварительная обработка ваших поисковых намеков на веб-сервис, чтобы загрузить их в автозаполненный массив и установить его адаптер. При желании используйте пользовательский адаптер курсора в зависимости от того, насколько сложны ваши подсказки.
что-то вроде:
AutoCompleteTextView inputSearch;
String[] autocompleteArray = new String[size of prefetched items];
//fill autocompleteArray with webservice data
inputSearch = (AutoCompleteTextView)findViewById(R.id.inputSearch);
searchAdapter = new ArrayAdapter<String>(context, R.layout.autcomplete_dropdown, autocompleteArray);
inputSearch.setAdapter(searchAdapter);
R.layout.autocomplete_dropdown
мог бы выглядеть что-то вроде:
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/name"
android:singleLine="false"
android:textSize="15sp"
android:paddingLeft="3dip"
android:paddingRight="3dip"
android:paddingTop="15dip"
android:paddingBottom="15dip"
android:textColor="#000000"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
Сделайте свой поиск в приложении, насколько большой контент вы будете искать? Предварительно загрузите все данные в SQLite и проверьте обновленные данные из сети каждый так часто наверно?
В противном случае я скажу, что вы должны ограничить количество времени, которое ваше приложение пытается запустить нить. Настройка своего рода таймера, которое будет: см. Если ...
- нить уже работает
- Вход изменился с последнего времени или имеет непустое значение поиска
- Пользователь даже на экране поиска
Если все в порядке, запустите нить, чтобы получить результаты
Просто мысль, не пробовал это
Создание потоков очень употребляющая операция. Таким образом, я бы порекомендовал иметь один поток, который впоследствии позвонит WebServices с новыми строками поиска.
То, что вы имеете в виду, это Авто завершено. Отказ Я не думаю, что вам нужно начать пару нити, чтобы справиться с этим. Работа с Android Авто завершено и использовать AutoCompleteTextView..
Кроме того, не рекомендуется использовать резьбы путем подкласса Java Thread или реализован интерфейс. Ты можешь использовать Асинктюз выполнять трудоемкие операции на заднем плане.