Android通讯录开发之解决快速搜索联系人线程同步问题


2013年1月13日

上一篇博客介绍的是如何实现搜索,在PhoneUtil中已经定义好了search方法,开发者直接拿来用就ok了,但用的时候肯定会遇到线程同步问题,如何解决搜索的时候UI线程卡顿的现象,这时候就需要另开一个线程来进行搜索操作了,但由于在搜索框输入字符的时候,一般都是快速输入的,这就会导致线程同步问题的出现,搜索出来的结果会不对。小巫由于经验不足还有相关知识的欠缺,在遇到这个问题的时候一直没能解决,所以只能去请教有经验的工程师了,最终也找到解决办法。

在UI线程我们知道超过5秒的操作就会出现卡顿或者ANR对话框,所以一般费时的操作绝不能放在UI线程,但数据的更新和通知就要放在UI线程来实现了,比如ListView的adapter的数据更新就要在UI线程里通知,不然就可能出现数据没有得到即使更新的现象。

这些问题只有在实际开发当中才会遇到,我废话也不多说了,下面是解决方案。

搜索框,文本变化的监听

searchEditText.addTextChangedListener(new TextWatcher() {@Overridepublic void onTextChanged(final CharSequence s, int start,int before, int count) {if (!TextUtils.isEmpty(s)) {btnClear.setVisibility(View.VISIBLE);selectAllBtn.setVisibility(View.GONE);searchList(s.toString());} else {// 如果输入框内容为空,显示全部btnClear.setVisibility(View.GONE);selectAllBtn.setVisibility(View.VISIBLE);searchList("");}}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count,int after) {}@Overridepublic void afterTextChanged(final Editable s) {}});

一般搜索框会有删除的×,我这里还有控制显示全选的框,效果如下:



在文本变化的时候会不断刷新列表,会调用searchList的方法,通过传递字符串来实现更新列表

通过lastest这个标识来解决线程同步问题,只有i跟lastest相等的时候采取刷新列表,其实这个办法并不土,不知道网友是否有更好的实现方法,麻烦指教一下。

private static int lastest = 0;// 实现线程同步搜索联系人// 线程同步问题可能会导致数据显示错误,比如会显示上一次搜索到的数据public void searchList(final String s) {// 用户可能正在快速输入电话号码,之前在搜索的联系人列表已经过时了。final int i = ++lastest;// 开一个线程来进行快速搜索new Thread(new Runnable() {@Overridepublic void run() {if (TextUtils.isEmpty(s)) {// 如果输入的字符串为空,则显示所有联系人searchContacts = allContacts;} else {// searhContacts指向搜索返回的listsearchContacts = PhoneUtil.search(s, allContacts);}if (i == lastest) { // 避免线程同步问题LocalContactActivity.this.runOnUiThread(new Runnable() {@Overridepublic void run() {if (i == lastest) { // 避免线程同步问题contactList.clear();contactList.addAll(searchContacts);refreshList();}}});}}}).start();}

数据有更新,调用adapter的notifyDataSetChanged()方法就可以达到刷新列表效果。


/** 刷新列表和确认按钮 **/public void refreshList() {// adapter.setContactList(contactList);adapter.notifyDataSetChanged();refreshBtnOK();}


不知道以上解决方案有没有帮你解决问题,如果没有麻烦请告知一声。

下篇博客会介绍如何实现全选、反选、删除等功能,敬请期待。



更多相关文章

  1. 一句话锁定MySQL数据占用元凶
  2. [Android(安卓)数据通信] android cmwap接入点
  3. Android之数据持久化(sqllite数据库)四
  4. android listview为什么会执行很多次,频繁调用getview
  5. 如何将Android数据库操作通用化(一)
  6. Android(安卓)ContentProvider数据共享全解析
  7. Android之音频开发基础入门
  8. Android最佳实践 为响应灵敏性设计
  9. android导入外部数据库到项目中的使用方法

随机推荐

  1. Android(安卓)- 判断当前是否使用的是Wif
  2. Android(安卓)下保持屏幕常亮的实现方法
  3. Android(安卓)The style on this compone
  4. Android虚拟sdcard
  5. Android学习之通过content provider获得
  6. API 25 (Android(安卓)7.1.1 API) widget
  7. Android样式设计
  8. 彻底解决Android中文乱码
  9. android刮刮乐
  10. AndroidManifest.xml文件详解(supports-sc