android的開發注意事項之更好的使用Handler,處理線程

來源:互聯網
上載者:User

在Android開發中經常會使用到線程,一想到線程,一般都會想到

new Thread(){...}.start();

這樣的方式。這樣如果在一個Activity中多次調用上面的代碼,那麼將建立多個匿名線程,如果這些線程的沒有被銷毀,那肯定會影響效能呢。這個時候我麼就想到了android提供的一個非同步處理線程的類HandlerThread。

一般Handler的用法

Handler handler = new Handler(){...};

這樣建立的handler是在主線程即UI線程下的Handler,即這個Handler是與UI線程下的預設Looper綁定的(當然也只有主線程才能這麼幹,子線程是幹不了的,除非自己建立個looper)。因此,有些時候會佔用ui主線程,引起一些問題,所以我們就想到了重新建立個子線程,來處理handler。。。。

使用HandlerThread解決問題

HandlerThread實際上繼承於Thread,只不過它比普通的Thread多了一個Looper。我們可以使用下面的例子建立Handler

HandlerThread thread = new HandlerThread("MyHandlerThread");thread.start();

建立HandlerThread時要把它啟動了,即調用start()方法。

接著就是handler的使用,如下:

mHandler = new Handler(thread.getLooper());//TODO:you can post or send something....

建立Handler時將HandlerThread中的looper對象傳入。那麼這個mHandler對象就是與HandlerThread這個線程綁定了(這時就不再是與UI線程綁定了,這樣它處理耗時操作將不會阻塞UI)。

使用Thread也可以解決問題

只要在子線程中建立個looper執行個體就可以了

其實本人覺得,handler於主線程綁定,未必會阻塞主線程,看了下源碼,發現在主線程中用handler,會自動產生一個子線程。。。

還有如果會引起阻塞,那handler的非同步不就自相矛盾了???

求高人解釋下。。。。。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.