在ActionBar上使用SearchView进行搜索时,我们一般使用searchview.setOnQueryTextListener()中的两个方法来提交搜索结果。我个人项目的代码如下,对SearchView中如何进行搜索操作不是很熟的同学也可以小小参考下,
sv.setOnQueryTextListener(new OnQueryTextListener(){
@Override
public boolean onQueryTextChange(String newText) {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
list.clear();
href.clear();
String str = null;
try {//encoding Chinese character
str = new String(query
.trim().getBytes(), "ISO-8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
SearchPost sp = new SearchPost(SEARCH_URL + str);
new Thread(sp).start();
return true;
}
});项目在虚拟机上测试时一切正常,但是在本人的DesireHD上测试时,搜索结果却被显示了两遍(本应是1,2,3,结果是1,2,3,1,2,3,)。
在handler类、线程类与submit方法中打断点一步步调试,我发现是submit这个方法被触发了两次,也就是说点击了键盘上search按钮后,里面的代码被先后执行了两次,而这个间隔时间比我的线程(需要联网,所以比较耗时)执行所花地时间要短,导致两次联网得到的结果在handler里一次性显示了,造成了搜索结果的重复。
在stackoverflow网站上提问,都没能解决该问题。后来在https://code.google.com/p/android/issues/detail?id=24599 这个网站,发现了门道:
But if I have the keyboard dock attached, the only way to search is typing something and then pressing Enter. When doing this, I get TWO invocations to the same method. Looking at the stack trace, they are the result of two KeyEvents: ACTION_DOWN and ACTION_UP, both associated to KEYCODE_ENTER.也就是说,是按下键盘上得search键和松开search键的过程中,产生了ACTION_DOWN和ACITON_UP两个消息,并且两个消息都触发了onQueryTextSubmit()方法。然后,我在自己的手机上测试,按下search键不松开,果然显示了正常的没有重复的搜索结果。
至此,问题差不多明白了:在某些机型(比如我的DesireHD)上,按下搜索键产生的两个消息会使submit方法触发两次,这是SDK或是手机中我们作为开发者无法解决的bug。
如何解决?既然submit方法会被ACTION_DOWN和ACTION_UP触发两次,两次触发之间的间隔就是用户按下和松开search键时的间隔。而我们知道,当搜索框中的字为空时,submit方法中得代码是不会被执行的。所以,只需要在执行一次之后,清空搜索框中输入的内容边可以解决这一问题~~~
so,在我的代码中,new Thread(sp).start();之后加上一行代码,sv.setIconified(),这个方法会清空QueryText,这样ACTION_UP的消息就不会再开启新submit方法中新的线程啦~~
在Android应用中,SearchView的onQueryTextSubmit()方法可能因设备差异导致执行两次,造成搜索结果重复。问题源于ACTION_DOWN和ACTION_UP事件,可通过在提交后立即iconify SearchView以清空查询文本,防止额外请求。
7427

被折叠的 条评论
为什么被折叠?



