談?wù)劇八阉鳌保?種場景下的最優(yōu)解

場景

Android中将谊,“搜索”事件無非下面兩種場景:
1蹂析、從網(wǎng)絡(luò)中搜索資源
2、從本地(緩存借杰、內(nèi)存)中搜索資源

下面是個搜索的gif过吻,要做到最優(yōu)體驗,首先應(yīng)該盡量避免無用的計算工作以及占用無意義的資源蔗衡。


search.gif

最優(yōu)解

1纤虽、從網(wǎng)絡(luò)中搜索資源

因為網(wǎng)絡(luò)資源需要流量的開銷,并且網(wǎng)絡(luò)請求過程不容易控制绞惦,所以該解決方案主要從流量逼纸、性能方便考慮。

設(shè)置一個延遲時間济蝉,過濾掉變化過快的字符:

比如設(shè)置延時時間為200ms杰刽,當(dāng)用戶輸入'a'后,200ms內(nèi)沒輸入新的字符王滤,則200ms后贺嫂,根據(jù)‘a(chǎn)’來搜索首字母為'a'的數(shù)據(jù)源;

如果用戶輸入'a'后雁乡,緊接著很快輸入了'b'第喳,'c'(每個字符間隔時間小于200ms),則在'c'輸入200ms后踱稍,根據(jù)'abc'來搜索首字母為'abc'的數(shù)據(jù)源曲饱。

總結(jié):該方案非常適合搜索網(wǎng)絡(luò)資源時使用吩跋。這種方案有效減少不必要的流量開銷,提升了用戶體驗渔工。

安利:如果你使用了RxJava,一個操作符就可以幫你搞定:Debounce桥温。Debounce操作符會過濾掉發(fā)射速率過快的數(shù)據(jù)項引矩。這里有一篇簡友翻譯的使用RxJava提升用戶體驗的簡書

2侵浸、從本地(緩存旺韭、內(nèi)存)中搜索資源

因為從本地中搜索資源相比較網(wǎng)絡(luò)中速度較快,整個搜索過程完全可控掏觉,所以該解決方案主要從搜索速度上考慮区端。

單個子線程處理搜索,配合標(biāo)志位澳腹,及時停止無意義的搜索過程:

比如當(dāng)用戶輸入'a'织盼,會立刻進(jìn)行查找,如果直到查找到結(jié)果也沒有新的字符變化時酱塔,則顯示結(jié)果沥邻;如果在查找過程中,用戶緊接著輸入'b'羊娃,則立即停止'a'的搜索過程唐全,重新以'ab'字符開始搜索首字母為'ab'的數(shù)據(jù)源。

總結(jié):該方案非常適合搜索本地資源時使用蕊玷。這種方案查找搜索結(jié)果是最高效的邮利。

談?wù)剬崿F(xiàn)

上述兩種解決方案都可以使用HandlerThread + 標(biāo)志位的方式實現(xiàn)。
HanlderThread本質(zhì)就是Thread + Looper垃帅,想深入了解HandlerThread的延届,可以查看Hongyang大神的這篇博客

另外有一種更科學(xué)的方式:SingleThreadExecutor線程池;相比HandlerThread挺智,線程池配合Future可以用更簡潔的代碼實現(xiàn)我們的需求祷愉。

下面以這種場景為例:

 // 創(chuàng)建 SingleThreadExecutor
 mExecutorService = Executors.newSingleThreadExecutor();
 // 每當(dāng)數(shù)據(jù)變化時調(diào)用 
 void onDataChanged() {
      if (mFuture != null) {
          // 數(shù)據(jù)變化時,取消上一個任務(wù)
          mFuture.cancel(true);
      }
      // 執(zhí)行異步任務(wù)
      mFuture = mExecutorService.submit(new Runnable() {
        @Override
         public void run() {
            final ArrayList<Result> resultDatas = filterDatas(datas);
            post(new Runnable() {
                @Override
                public void run() {
                    // 根據(jù)resultDatas 更新UI
                }
            });
          }
      });
  }

上面代碼就是整個實現(xiàn)過程了赦颇,注釋應(yīng)該解釋的很清楚啦二鳄,就不多廢話了。

至于第一種方案的實現(xiàn)媒怯,如果不用RxJava的話订讼,使用HandlerThread也是可以實現(xiàn)的,不需要標(biāo)志位(網(wǎng)絡(luò)請求一般是不可控的扇苞,標(biāo)志位沒什么意義)欺殿,而是配合Hanlderd的removeCallbacks方法寄纵,或者removeMessages方法移除Callback/Messages。具體實現(xiàn)感興趣的脖苏,可以自己去試試吧程拭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市棍潘,隨后出現(xiàn)的幾起案子恃鞋,更是在濱河造成了極大的恐慌,老刑警劉巖亦歉,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恤浪,死亡現(xiàn)場離奇詭異,居然都是意外死亡肴楷,警方通過查閱死者的電腦和手機(jī)水由,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赛蔫,“玉大人砂客,你說我怎么就攤上這事”裟迹” “怎么了鞭盟?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瑰剃。 經(jīng)常有香客問我齿诉,道長,這世上最難降的妖魔是什么晌姚? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任粤剧,我火速辦了婚禮,結(jié)果婚禮上挥唠,老公的妹妹穿的比我還像新娘抵恋。我一直安慰自己,他們只是感情好宝磨,可當(dāng)我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布弧关。 她就那樣靜靜地躺著,像睡著了一般唤锉。 火紅的嫁衣襯著肌膚如雪世囊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天窿祥,我揣著相機(jī)與錄音株憾,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛嗤瞎,可吹牛的內(nèi)容都是我干的墙歪。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼贝奇,長吁一口氣:“原來是場噩夢啊……” “哼虹菲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掉瞳,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤届惋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后菠赚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡郑藏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年衡查,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片必盖。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡拌牲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出歌粥,到底是詐尸還是另有隱情塌忽,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布失驶,位于F島的核電站土居,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嬉探。R本人自食惡果不足惜擦耀,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涩堤。 院中可真熱鬧眷蜓,春花似錦、人聲如沸胎围。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽白魂。三九已至汽纤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碧聪,已是汗流浹背冒版。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留逞姿,地道東北人辞嗡。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓捆等,卻偏偏與公主長得像,于是被迫代替她去往敵國和親续室。 傳聞我的和親對象是個殘疾皇子栋烤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容