Вопрос

Я создал класс, который является расширением нити. Этот класс попадает в веб-сервис и бросает некоторые данные на экран. Мне все равно, чтобы сохранить эти данные (экран отображает результаты поиска).

В настоящее время пользователь просто вписывается в 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 и проверьте обновленные данные из сети каждый так часто наверно?

В противном случае я скажу, что вы должны ограничить количество времени, которое ваше приложение пытается запустить нить. Настройка своего рода таймера, которое будет: см. Если ...

  1. нить уже работает
  2. Вход изменился с последнего времени или имеет непустое значение поиска
  3. Пользователь даже на экране поиска

Если все в порядке, запустите нить, чтобы получить результаты

Просто мысль, не пробовал это

Создание потоков очень употребляющая операция. Таким образом, я бы порекомендовал иметь один поток, который впоследствии позвонит WebServices с новыми строками поиска.

То, что вы имеете в виду, это Авто завершено. Отказ Я не думаю, что вам нужно начать пару нити, чтобы справиться с этим. Работа с Android Авто завершено и использовать AutoCompleteTextView..

Кроме того, не рекомендуется использовать резьбы путем подкласса Java Thread или реализован интерфейс. Ты можешь использовать Асинктюз выполнять трудоемкие операции на заднем плане.

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