Android通讯录开发之解决快速搜索联系人线程同步问题
2014-03-21 16:08
316 查看
转载自小巫的博客: http://blog.csdn.net/wwj_748/article/details/18216721
上一篇博客介绍的是如何实现搜索,在PhoneUtil中已经定义好了search方法,开发者直接拿来用就ok了,但用的时候肯定会遇到线程同步问题,如何解决搜索的时候UI线程卡顿的现象,这时候就需要另开一个线程来进行搜索操作了,但由于在搜索框输入字符的时候,一般都是快速输入的,这就会导致线程同步问题的出现,搜索出来的结果会不对。小巫由于经验不足还有相关知识的欠缺,在遇到这个问题的时候一直没能解决,所以只能去请教有经验的工程师了,最终也找到解决办法。
在UI线程我们知道超过5秒的操作就会出现卡顿或者ANR对话框,所以一般费时的操作绝不能放在UI线程,但数据的更新和通知就要放在UI线程来实现了,比如ListView的adapter的数据更新就要在UI线程里通知,不然就可能出现数据没有得到即使更新的现象。
这些问题只有在实际开发当中才会遇到,我废话也不多说了,下面是解决方案。
搜索框,文本变化的监听
[java] view
plaincopy
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相等的时候采取刷新列表,其实这个办法并不土,不知道网友是否有更好的实现方法,麻烦指教一下。
[java] view
plaincopy
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()方法就可以达到刷新列表效果。
[java] view
plaincopy
/** 刷新列表和确认按钮 **/
public void refreshList() {
// adapter.setContactList(contactList);
adapter.notifyDataSetChanged();
refreshBtnOK();
}
上一篇博客介绍的是如何实现搜索,在PhoneUtil中已经定义好了search方法,开发者直接拿来用就ok了,但用的时候肯定会遇到线程同步问题,如何解决搜索的时候UI线程卡顿的现象,这时候就需要另开一个线程来进行搜索操作了,但由于在搜索框输入字符的时候,一般都是快速输入的,这就会导致线程同步问题的出现,搜索出来的结果会不对。小巫由于经验不足还有相关知识的欠缺,在遇到这个问题的时候一直没能解决,所以只能去请教有经验的工程师了,最终也找到解决办法。
在UI线程我们知道超过5秒的操作就会出现卡顿或者ANR对话框,所以一般费时的操作绝不能放在UI线程,但数据的更新和通知就要放在UI线程来实现了,比如ListView的adapter的数据更新就要在UI线程里通知,不然就可能出现数据没有得到即使更新的现象。
这些问题只有在实际开发当中才会遇到,我废话也不多说了,下面是解决方案。
搜索框,文本变化的监听
[java] view
plaincopy
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相等的时候采取刷新列表,其实这个办法并不土,不知道网友是否有更好的实现方法,麻烦指教一下。
[java] view
plaincopy
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()方法就可以达到刷新列表效果。
[java] view
plaincopy
/** 刷新列表和确认按钮 **/
public void refreshList() {
// adapter.setContactList(contactList);
adapter.notifyDataSetChanged();
refreshBtnOK();
}
相关文章推荐
- Android通讯录开发之解决快速搜索联系人线程同步问题
- Android通讯录开发之解决快速搜索联系人线程同步问题
- Android中获取系统通讯录联系人并解决Android6.0权限问题
- 解决Android中无法搜索联系人的问题
- Android通讯录开发之通讯录联系人搜索功能最新实现
- Android开发中遇到的问题(四)——Android中WARNING: Application does not specify an API level requirement!的解决方法
- Android开发-----关于解决Retrofit打印HttpLog和设置连接超时的问题
- android开发图片分辨率问题解决方案
- Android开发中如何解决加载大图片时内存溢出的问题
- 一个Android应用开发菜鸟的成长之路——工作第一天:解决了java.lang.NoClassDefFoundError问题
- android开发(37) android使用android_serialport_api 操作串口,解决权限问题
- Android开发—解决自定义GridView高度第一个item高度异常问题
- 开发问题及解决 java.lang.ClassCastException:android.widget.LinearLayout$LayoutParams
- android 开发问题集,android问题总结,android错误解决收集
- Android项目实战_新浪微博客户端开发过程中遇到的问题及解决办法01
- Android开发之仿联系人界面(根据文字首字母A、B、C实现快速索引)
- Android 开发问题及解决汇总
- 解决Android通讯录中显示姓名颠倒问题的小工具的源代码
- Android Eclipse工程开发中的常见调试问题(二)android.os.NetworkOnMainThreadException 异常的解决办法
- Android软件开发之获取通讯录联系人信息(二十九)