SearchView中onQueryTextSubmit()执行两次的原因和解决办法

在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方法中新的线程啦~~

你可能感兴趣的:(原创)