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) {}});
一般搜尋方塊會有刪除的×,我這裡還有控制顯示全選的框,效果如下:
vc7KzOKjrNa709BpuPpsYXN0ZXN0z+C1yLXEyrG68rLJyKHLotDCwdCx7aOsxuTKtdXiuPaw7LeosqKyu83Bo6yyu9aqtcDN+NPRyse38dPQuPy6w7XEyrXP1re9t6ijrMLpt7PWuL3M0rvPwqGjPC9wPgo8cD48cHJlIGNsYXNzPQ=="brush:java;">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();}
不知道以上解決方案有沒有幫你解決問題,如果沒有麻煩請告知一聲。
下篇部落格會介紹如何?全選、反選、刪除等功能,敬請期待。