Убийства темы - PullRequest
       10

Убийства темы

1 голос
/ 04 ноября 2010

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

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

Это означает, что при вводе пользователем параметры поиска изменяются. Я хочу иметь возможность убить текущий запущенный поток (если он запущен в данный момент) и создать новый с новой строкой поиска . Как этого достичь? Могу ли я сделать это с помощью Thread или мне нужно будет использовать новый объект?

Ответы [ 4 ]

2 голосов
/ 04 ноября 2010

Это сложнее, чем просто убить нить.Вы можете вызвать interrupt () для потока, но поток должен будет периодически проверять свое состояние прерывания и самостоятельно завершать работу.

Во-вторых, вы не захотите начинать тему сразу после того, как пользователь введет текст.Вы быстро сократите систему с порождением потока.Реализуйте период ожидания 100-200 миллисекунд перед выполнением поиска, чтобы вы могли быть разумно уверены, что пользователь закончил печатать.Сервер Google может справиться с нагрузкой, но телефон не сможет.

РЕДАКТИРОВАТЬ: если говорить о моем первом пункте, темы может быть трудно отменить.В этом случае поток диспетчеризации событий должен каким-то образом сообщить работающему потоку, что он должен остановиться.Вы можете использовать средство interrupt, встроенное в потоки, но оно, как указано в этой статье , может показаться обидным.Вместо этого я бы просто имел переменную boolean, которая может быть установлена ​​на cancelled каким-либо внешним потоком.Хитрость (как показано в этой ссылке) заключается в том, что вам нужно будет периодически проверять, был ли поток отменен, и если это так, вам нужно будет вручную прервать.

Следующая проблема, с которой вы столкнетесь, - это если веб-вызов уже был сделан на каком-то внешнем сервере.Он будет блокироваться в этом потоке, пока не вернется, и поток не сможет убить себя.Это может занять несколько секунд.

Итак, давайте поиграем - что если пользователь наберет символ, и по какой-то причине истечет ваш период ожидания, и будет сделан веб-вызов, то пользователь наберет другой символ, когда истечет период ожидания, так что другой веб-вызовсделан?Если ваши веб-вызовы занимают 5 секунд, то первый поток продолжит работу, даже если поток рассылки событий отменит его, как минимум на 5 секунд.Теперь у вас есть два потока, делающих веб-вызовы.

Теперь разверните это.Что если пользователь делает это и создает 4 или 5 потоков?Это где вы перегружаете ресурсы своего телефона.Я не говорю вам не заниматься этим, я просто пытаюсь указать на потенциальные проблемы, которые возникают с территорией.

2 голосов
/ 04 ноября 2010

Используйте виджет 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" /> 

doВаш поиск в приложении, насколько большой контент вы будете искать?предварительно загружать все данные в sqlite и проверять обновленные данные из Интернета, возможно, так часто?

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

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

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

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

0 голосов
/ 04 ноября 2010

Что вы имеете в виду Автозаполнение .Я не думаю, что вам нужно запустить пару потоков, чтобы справиться с этим.Работайте с android Auto Complete и используйте AutoCompleteTextView .

Кроме того, не рекомендуется использовать потоки путем создания подклассов потока Java или реализации интерфейса.Вы можете использовать AsyncTask для выполнения длительных операций в фоновом режиме.

0 голосов
/ 04 ноября 2010

Создание потоков - очень трудоемкая операция.Поэтому я бы порекомендовал создать один поток, который впоследствии будет вызывать веб-сервисы с новыми строками поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...