Android通訊錄開發之解決快速搜尋連絡人線程同步問題

來源:互聯網
上載者:User

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();}


不知道以上解決方案有沒有幫你解決問題,如果沒有麻煩請告知一聲。

下篇部落格會介紹如何?全選、反選、刪除等功能,敬請期待。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.