Итак, я пытаюсь написать код для поиска JTextField, который извлекает результаты из Интернета (например, как подсказки поиска Google). Единственная проблема - это, наверное, отсутствие опыта программирования. В частности, я настроил его, когда пользователь нажимает на ключ, он отправляет запрос с помощью входа JTextField через HttpURLConnection и получает результаты, затем обновляет. Но всякий раз, когда HttpURLConnection работает, он замораживает программу на пару секунд, пока она делает свою вещь, что в основном запрещает вводить больше символов в поле поиска, если я не возражаю против чего-либо еще. Я рассмотрел использование отдельных потоков, но я не уверен, как правильно прервать поток и начать его с использования новых данных, а все остальное ждет на нем, но все же принимает новые данные. Я рассматривал возможность использованияСинхронизация HttpURLConnection и KeyListener:
thread.stop();
, чтобы помочь управлять проблему, но от того, что я прочитал, что, кажется, табу (я прав?). В любом случае, здесь довольно много, что я использую:
public class SearchField extends JTextField implements KeyListener {
public SearchField() {
addkeyListener(this);
}
public void updateData(ArrayList<String results) {
/*Pass the data off the the GUI*/
{
@Override
public void keyTyped(KeyEvent e) {
SearchQuery query = new SearchQuery(this.getText());
updateData(query.getResults());
}
}
public class SearchQuery {
ArrayList<String> results = new ArrayList<String>();
public SearchQuery(String search) {
String search_path = "http://www.whatever.com/" + search;
URL url = new URL(search_path);
conn = (HttpURLConnection) url.openConnection();
conn.addRequestProperty("User-Agent", "Mozilla/4.76");
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
StringBuffer buf = new StringBuffer();
int i;
while((i = in.read()) != -1) {
buf.append((char) i);
}
String data = buf.toString();
parse(data);
}
public void parse(String data) {
/*Parse a bunch of JSON, return the results in an array*/
results.add(data);
}
public ArrayList<String> getResults() {
return results;
}
}
Я просто в недоумении, как синхронизировать ПОЛУЧАТЬ непрерывный ввод при получении новых результатов для каждого нажатия кнопок и отклоняя незаконченные соединения и их обработку соответствующих данных, когда он становится недействительным при следующем нажатии клавиши.
Вам нужно выполнить поиск в другом потоке, если вы не хотите, чтобы событие Dispatch Thread для замораживания. – Kayaman
Должен ли я просто распоряжаться текущей нитью каждый раз, когда он получает новый вход? И как мне заставить его ждать в потоке, чтобы довести результаты до обновления графического интерфейса? – Kyle
Вы могли бы отметить старые потоки как ненужные с помощью простого булевого флага, поэтому они не будут обновлять графический интерфейс, если более свежий поток получает результаты. Также см. Ответ, предоставленный tbodt. – Kayaman