如果我們要在主線程中完成耗時工作那么肯定會柱堵塞主線程氨距,那么用戶體驗就會很差桑逝,因此我們需要使用子線程。但是如果在子線程中更新UI組件那么就會出現(xiàn)異常俏让,原因很簡單楞遏,android 的 UI 也會線程不安全。下面介紹使用 handler 更新UI
定義內(nèi)部類Hadler方法時首昔,要重寫方法 handlerMessage(),可以在其中定義線程寡喝。
下面介稍 hander 的內(nèi)部原理。
首先說明 為什么用 handler.obtainMessage ,不用 new 因為 Hendler有一個消息池勒奇,用于存儲messge 可以反復(fù)使用预鬓,每個線程只有一個 MessageQueue與 Handler綁定。
上面是使用 Handler 更新UI的基本方法撬陵,但是細(xì)心的你會發(fā)現(xiàn)其中定義的內(nèi)部類Hanlder代碼是黃色Waring? 警告的珊皿,這是為什么呢? 因為這樣寫存在內(nèi)存泄漏問題巨税,因為內(nèi)部類依賴外部類蟋定,當(dāng)外部類退出,而這個靜態(tài)內(nèi)部類依然在運行草添,那么外部類依然占用內(nèi)存驶兜,并且不能訪問數(shù)據(jù),這就是內(nèi)存泄露問題远寸。解決飯方法很簡單抄淑,使用靜態(tài)內(nèi)部類就行了,并且使用弱引用驰后,弱引用就是當(dāng)內(nèi)存不夠時肆资,系統(tǒng)就會回收內(nèi)存,使用如下灶芝。
接下來介紹使用 Handler 來設(shè)置閃屏頁郑原。首先找一張圖片,放在 mipmap 中夜涕,當(dāng)然你需要根據(jù)圖片大小來選擇幾個x的犯犁,如果選擇不當(dāng)會報錯 。當(dāng)然女器,啟動頁是沒有 ActionBar的酸役,所以需要進行設(shè)置,繼承Activity 而不是?AppCompatActivity,然后在清單文件中設(shè)置主題涣澡。當(dāng)然也可是其他沒有ActionBar 的贱呐。
然后進行布局設(shè)置,這里直接使用ImageView 并直接添加圖片入桂。
然后在閃屏頁的主頁進行設(shè)置吼句,這里沒有使用標(biāo)準(zhǔn)的寫法,原因是這里的內(nèi)部類并不耗時事格。然后別忘記了 finish() 否則按回退鍵會返回到 商品頁 這樣用戶體驗就會極差惕艳。
以上是使用 線程加Handler 來實現(xiàn)異步任務(wù),接下來介紹是使用AsyncTask? 這是系統(tǒng)封裝好的使用異步任務(wù)驹愚。具體 參數(shù) 四個方法 如下
具體實現(xiàn)如下
具體思想就是上面這樣诚撵,但是可以分情況選項使用那個方法占锯。