Android:当用户暂停键入时,如何向Google API发送请求?
我正在开发这个应用程序,用户可以在autoCompleteTextView中输入一个位置,它将根据Google Places Api建议位置,如前所述Android:当用户暂停键入时,如何向Google API发送请求?,android,autocomplete,Android,Autocomplete,我正在开发这个应用程序,用户可以在autoCompleteTextView中输入一个位置,它将根据Google Places Api建议位置,如前所述 但是,我想限制应用程序发送的请求量,仅在用户停止键入一段时间后发送请求。有人知道怎么做吗?我找到了解决上述问题的方法,效果非常好。我用以下方式扩展了AutoCompleteTextView。如果有人知道如何进一步改进此代码,请让我知道 public class MyAutoCompleteTextView extends AutoComplete
但是,我想限制应用程序发送的请求量,仅在用户停止键入一段时间后发送请求。有人知道怎么做吗?我找到了解决上述问题的方法,效果非常好。我用以下方式扩展了AutoCompleteTextView。如果有人知道如何进一步改进此代码,请让我知道
public class MyAutoCompleteTextView extends AutoCompleteTextView {
// initialization
int threshold;
int delay = 750;
Handler handler = new Handler();
Runnable run;
// constructor
public MyAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void performFiltering(final CharSequence text, final int keyCode) {
// get threshold
threshold = this.getThreshold();
// perform filter on null to hide dropdown
doFiltering(null, keyCode);
// stop execution of previous handler
handler.removeCallbacks(run);
// creation of new runnable and prevent filtering of texts which length
// does not meet threshold
run = new Runnable() {
public void run() {
if (text.length() > threshold) {
doFiltering(text, keyCode);
}
}
};
// restart handler
handler.postDelayed(run, delay);
}
// starts the actual filtering
private void doFiltering(CharSequence text, int keyCode) {
super.performFiltering(text, keyCode);
}
}
您可以使用TextWatcher,监视文本条目之间的间隔时间。我个人不喜欢对原生Android控件进行分类的想法(尽管,这肯定是一种有效的方法,只是不是我喜欢的方法) 文件: 还有一个SO链接: 类似于,但略为简洁,不引入额外的状态。您也不需要阈值检查,因为只有在实际需要过滤时才会调用
performFiltering
子类化AutoCompleteTextView
似乎是唯一的方法,因为您无法覆盖/替换AutoCompleteTextView
添加的TextWatcher
public class DelayAutoCompleteTextView extends AutoCompleteTextView {
public DelayAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
DelayAutoCompleteTextView.super.performFiltering((CharSequence) msg.obj, msg.arg1);
}
};
@Override
protected void performFiltering(CharSequence text, int keyCode) {
mHandler.removeMessages(0);
mHandler.sendMessageDelayed(mHandler.obtainMessage(0, keyCode, 0, text), 750);
}
}
与上面的答案类似,我发现我需要将AutoCompleteTextView子类化。然而,因为我住的地方互联网速度有点慢,我发现每次用户按键时删除延迟的处理程序都是一个问题。所以基本上,如果我在用户停止输入500毫秒后才运行过滤器,结果可能需要几秒钟才能显示出来,这会让用户感到恼火 因此,我并不是每次都清除处理程序,而是让过滤每隔几百毫秒运行一次。我的代码远不如Jan Berkel的干净。我相信你可以稍微整理一下我太懒了,但在网速慢的地方性能更好
public class CustomCompleteView extends AutoCompleteTextView{
Handler handler=new Handler();
Runnable r;
boolean cleartogo=false;
boolean pending =false;
CharSequence btext;
int bkeyCode;
public CustomCompleteView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public CustomCompleteView(Context context, AttributeSet attrs)
{
super(context,attrs);
}
public CustomCompleteView(Context context, AttributeSet attrs, int defStyle)
{
super(context,attrs,defStyle);
}
@Override
public void performFiltering(CharSequence text, int keyCode){
if (cleartogo){
cleartogo=false;
Log.d(MainActivity.DTAG,"Going to filter on " + text.toString());
pending=false;
super.performFiltering(btext, bkeyCode);
}
else
{
Log.d(MainActivity.DTAG,"Filtering rejected, too soon");
btext=text;
bkeyCode=keyCode;
if (!pending){
if (r==null)
r=new MyRunnable(this);
//try{handler.removeCallbacks(r);} catch (Exception ex){};
handler.postDelayed(r, 500);
pending=true;}
}
}
private class MyRunnable implements Runnable {
CustomCompleteView bc;
MyRunnable(CustomCompleteView c ) {
this.bc=c;
}
public void run() {
Log.d(MainActivity.DTAG,"Special Runnable running");
cleartogo=true;
bc.performFiltering(btext, bkeyCode);
}
}
}
谢谢分享。我在Google Place API中使用了这个,我正在使用AutoCompleteTextView的适配器,它实现了可过滤接口,并有自己的PerformFilter方法。我可以使用此设置实现上述功能吗?我认为在调度延迟消息和调用
handleMessage()
之间键入的任何字符都会丢失,除非AutoCompleteTextView
向您提供了对内部CharSequence
的引用,而不是到目前为止文本的副本。调用performFiltering()
@ColinM时,让handleMessage()
方法从视图中提取文本可能更安全。这两个事件之间只有一个瞬间的延迟。因此,我想根据消息预定时捕获的文本进行过滤可能是可以的