为了在搜索时减少服务器过载,我将为键盘输入提供延迟。
用例:
1。用户类型符号
2。如果输入符号之间的延迟< 1秒,立即搜索 ,等待最后一个输入符号后的延迟> 1秒
3。如果输入符号之间的延迟> 1秒,该搜索立即执行
JSE或移动Java(Blackberry)中是否有最佳实践?
答案 0 :(得分:1)
是的,使用TimerTask。我建议您对规则进行额外更改:只需确保请求间隔至少一秒,但不要等到用户停止输入一秒钟之后。当timout到期时,立即发出一个具有输入字段状态的新请求。用户可能正在打字,但他对您的应用程序的体验将更加流畅和响应。
答案 1 :(得分:1)
根据Java并发圣经'Java concurrency in practice'
... Timer有一些缺点,应该将ScheduledThreadPoolExecutor视为替代。
因此,我会做这样的例子:
public class DelayedSearch extends JFrame {
public DelayedSearch() {
final JPanel panel = new JPanel(new BorderLayout());
final JTextField field = new JTextField(30);
panel.add(field, BorderLayout.NORTH);
final JLabel status = new JLabel(" ");
panel.add(status, BorderLayout.SOUTH);
this.add(panel);
this.pack();
final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
field.addKeyListener(new KeyAdapter() {
private ScheduledFuture<?> scheduled;
@Override
public void keyTyped(KeyEvent e) {
if (scheduled != null) scheduled.cancel(false);
scheduled = executor.schedule(new Runnable() {
@Override
public void run() { // Perform search here. Just set status for demo.
status.setText("Search: " + field.getText());
}
}, 1, TimeUnit.SECONDS);
}
});
}
public static void main(String[] args) {
new DelayedSearch().setVisible(true);
}
}
注意:我正在从EDT以外的线程更新状态,这是非法的,但你明白了。
编辑:基于下面的好评(谢谢!)Timer
将在这个简单的情况下工作,并且它可以很容易地使用守护程序线程(虽然它确实存在抛出异常的任务的问题,如上所述在书里)。为此,请按以下方式替换上述执行程序和侦听器:
...
final Timer timer = new Timer(true); // use daemon thread.
field.addKeyListener(new KeyAdapter() {
private TimerTask task;
@Override
public void keyTyped(KeyEvent e) {
if(task != null)task.cancel();
task = new TimerTask() {
@Override
public void run() {
status.setText("Search: " + field.getText());
}
};
timer.schedule(task, 1000);
}
});