Android中invalidate()和postInvalidate() 的區(qū)別及使用方法
Android中實(shí)現(xiàn)view的更新有兩組方法,一組是invalidate,另一組是postInvalidate,其中前者是在UI線程自身中使用,而后者在非UI線程中使用。
Android提供了Invalidate方法實(shí)現(xiàn)界面刷新,但是Invalidate不能直接在線程中調(diào)用,因?yàn)樗沁`背了單線程模型:Android UI操作并不是線程安全的,并且這些操作必須在UI線程中調(diào)用。
invalidate()是用來(lái)刷新View的,必須是在UI線程中進(jìn)行工作。比如在修改某個(gè)view的顯示時(shí),調(diào)用invalidate()才能看到重新繪制的界面。invalidate()的調(diào)用是把之前的舊的view從主UI線程隊(duì)列中pop掉。 一個(gè)Android 程序默認(rèn)情況下也只有一個(gè)進(jìn)程,但一個(gè)進(jìn)程下卻可以有許多個(gè)線程。
在這么多線程當(dāng)中,把主要是負(fù)責(zé)控制UI界面的顯示、更新和控件交互的線程稱為UI線程,由于onCreate()方法是由UI線程執(zhí)行的,所以也可以把UI線程理解為主線程。其余的線程可以理解為工作者線程。
invalidate()得在UI線程中被調(diào)動(dòng),在工作者線程中可以通過(guò)Handler來(lái)通知UI線程進(jìn)行界面更新;而postInvalidate()在工作者線程中被調(diào)用。
利用invalidate()刷新界面
實(shí)例化一個(gè)Handler對(duì)象,并重寫(xiě)handleMessage方法調(diào)用invalidate()實(shí)現(xiàn)界面刷新;而在線程中通過(guò)sendMessage發(fā)送界面更新消息。
// 在onCreate()中開(kāi)啟線程 new Thread( new GameThread()).start();、 // 實(shí)例化一個(gè)handler Handler myHandler = new Handler() { // 接收到消息后處理 public void handleMessage(Message msg) { switch (msg.what) { case Activity01.REFRESH: mGameView.invalidate(); // 刷新界面 break ; } super .handleMessage(msg); } }; class GameThread implements Runnable { public void run() { while (!Thread.currentThread().isInterrupted()) { Message message = new Message(); message.what = Activity01.REFRESH; // 發(fā)送消息 Activity01.this .myHandler.sendMessage(message); try { Thread.sleep(100 ); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } // 在onCreate()中開(kāi)啟線程 new Thread(new GameThread()).start();、 // 實(shí)例化一個(gè)handler Handler myHandler = new Handler() { // 接收到消息后處理 public void handleMessage(Message msg) { switch (msg.what) { case Activity01.REFRESH: mGameView.invalidate(); // 刷新界面 break; } super.handleMessage(msg); } }; class GameThread implements Runnable { public void run() { while (!Thread.currentThread().isInterrupted()) { Message message = new Message(); message.what = Activity01.REFRESH; // 發(fā)送消息 Activity01.this.myHandler.sendMessage(message); try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } }
使用postInvalidate()刷新界面
使用postInvalidate則比較簡(jiǎn)單,不需要handler,直接在線程中調(diào)用postInvalidate即可。
class GameThread implements Runnable { public void run() { while (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(100 ); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } // 使用postInvalidate可以直接在線程中更新界面 mGameView.postInvalidate(); } } }
以上所述是小編給大家分享的Android中invalidate()和postInvalidate() 的區(qū)別及使用方法,希望對(duì)大家有所幫助!
相關(guān)文章
Android利用AudioRecord類實(shí)現(xiàn)音頻錄制程序
這篇文章主要為大家詳細(xì)介紹了Android利用AudioRecord類實(shí)現(xiàn)音頻錄制程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04SDL2和OpenGL使用踩坑筆記經(jīng)驗(yàn)分享
今天小編就為大家分享一篇關(guān)于SDL2和OpenGL使用踩坑筆記經(jīng)驗(yàn)分享,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12Android自定義View實(shí)現(xiàn)帶數(shù)字的進(jìn)度條實(shí)例代碼
這篇文章主要介紹了Android自定義View實(shí)現(xiàn)帶數(shù)字的進(jìn)度條實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-03-0330分鐘搞清楚Android Touch事件分發(fā)機(jī)制
30分鐘搞清楚Android Touch事件分發(fā)機(jī)制,Touch事件分發(fā)中只有兩個(gè)主角:ViewGroup和View,想要深入學(xué)習(xí)的朋友可以參考本文2016-03-03Android 中ListView的Item點(diǎn)擊事件失效的快速解決方法
這篇文章主要介紹了Android 中ListView的Item點(diǎn)擊事件失效的快速解決方法的相關(guān)資料,需要的朋友可以參考下2016-09-09基于Android week view仿小米和iphone日歷效果
這篇文章主要為大家詳細(xì)介紹了基于Android week view仿小米和iphone日歷效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11andriod開(kāi)發(fā)之Activity的渲染機(jī)制
本文給大家分享的是在andriod開(kāi)發(fā)中經(jīng)常需要用到的Activity的渲染機(jī)制的詳細(xì)說(shuō)明,主要是通過(guò)實(shí)例給大家講解Activity是如何畫(huà)到屏幕上的,希望大家能夠喜歡2018-03-03android studio編譯jar包或者aar包的方法教程詳解
這篇文章主要介紹了android studio編譯jar包或者aar包的方法教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03Android開(kāi)發(fā)之DatePicker和TimePicker實(shí)現(xiàn)選擇日期時(shí)間功能示例
這篇文章主要介紹了Android開(kāi)發(fā)之DatePicker和TimePicker實(shí)現(xiàn)選擇日期時(shí)間功能,結(jié)合實(shí)例形式分析了Android DatePicker和TimePicker組件的功能、常用函數(shù)、布局及日期時(shí)間選擇相關(guān)操作技巧,需要的朋友可以參考下2019-03-03