android 功能模块之通讯模块三
来源:互联网 发布:apache 2.2.21 漏洞 编辑:程序博客网 时间:2024/05/22 15:57
Android通讯录开发之解决快速搜索联系人线程同步问题
2013年1月13日
上一篇博客介绍的是如何实现搜索,在PhoneUtil中已经定义好了search方法,开发者直接拿来用就ok了,但用的时候肯定会遇到线程同步问题,如何解决搜索的时候UI线程卡顿的现象,这时候就需要另开一个线程来进行搜索操作了,但由于在搜索框输入字符的时候,一般都是快速输入的,这就会导致线程同步问题的出现,搜索出来的结果会不对。小巫由于经验不足还有相关知识的欠缺,在遇到这个问题的时候一直没能解决,所以只能去请教有经验的工程师了,最终也找到解决办法。
在UI线程我们知道超过5秒的操作就会出现卡顿或者ANR对话框,所以一般费时的操作绝不能放在UI线程,但数据的更新和通知就要放在UI线程来实现了,比如ListView的adapter的数据更新就要在UI线程里通知,不然就可能出现数据没有得到即使更新的现象。
这些问题只有在实际开发当中才会遇到,我废话也不多说了,下面是解决方案。
搜索框,文本变化的监听
- searchEditText.addTextChangedListener(new TextWatcher() {
- @Override
- public 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("");
- }
- }
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count,
- int after) {
- }
- @Override
- public 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() {
- @Override
- public void run() {
- if (TextUtils.isEmpty(s)) {
- // 如果输入的字符串为空,则显示所有联系人
- searchContacts = allContacts;
- } else {
- // searhContacts指向搜索返回的list
- searchContacts = PhoneUtil.search(s, allContacts);
- }
- if (i == lastest) { // 避免线程同步问题
- LocalContactActivity.this.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- if (i == lastest) { // 避免线程同步问题
- contactList.clear();
- contactList.addAll(searchContacts);
- refreshList();
- }
- }
- });
- }
- }
- }).start();
- }
数据有更新,调用adapter的notifyDataSetChanged()方法就可以达到刷新列表效果。
- /** 刷新列表和确认按钮 **/
- public void refreshList() {
- // adapter.setContactList(contactList);
- adapter.notifyDataSetChanged();
- refreshBtnOK();
- }
不知道以上解决方案有没有帮你解决问题,如果没有麻烦请告知一声。
下篇博客会介绍如何实现全选、反选、删除等功能,敬请期待。
0 0
- android 功能模块之通讯模块三
- android 功能模块之通讯模块
- android 功能模块之通讯模块四
- android 功能模块之通讯模块五
- android功能模块之通讯模块六
- android功能模块之通讯模块七
- android功能模块之通讯功能模块一
- Android学习之 换肤功能模块的实现<三>
- Android蓝牙通讯模块
- corethink功能模块探索开发(三)让这个模块可见
- sbl1功能模块 -- DAL模块
- (三)创建功能模块
- android之http通讯,
- Android---功能模块一之颜色选择器自定义Preference 对话框
- Android学习之 换肤功能模块的实现<一>
- Android学习之 换肤功能模块的实现<二>
- 串口通讯控制器实现之----发送模块
- android 获取通讯模块制式类型
- android功能模块之通讯功能模块一
- adb logcat 重定向到文件
- 教你学用CURL命令 --- 命令行浏览器
- Infragistic 2006 Grid和Toolbar有冲突
- android 功能模块之通讯模块
- android 功能模块之通讯模块三
- LeetCode OJ:Search a 2D Matrix
- Mongodb在Windows下安装及配置
- Boilerplate Detection Using Shallow Text Features论文小笔记
- REST WebService与SOAP WebService的比较
- eclipse debug (调试) 学习心得
- 关于oracle查询视图中的insufficient privileges
- android 功能模块之通讯模块四
- android 功能模块之通讯模块五