您好,登錄后才能下訂單哦!
本文首發(fā)于cartoon的博客
轉(zhuǎn)載請(qǐng)注明出處:https://cartoonyu.github.io/cartoon-blog
近段時(shí)間有一個(gè)需求:在線獲取圖片并且顯示在界面上。因?yàn)樵诰€獲取圖片必定會(huì)有延遲,如果在主線程中獲取會(huì)有很大幾率造成主線程阻塞。解決的辦法是開(kāi)辟子線程進(jìn)行網(wǎng)絡(luò)訪問(wèn)。新的問(wèn)題又出現(xiàn)了:android的UI更新必須在主線程中完成。但是子線程的值脫離線程會(huì)無(wú)效,造成java.lang.NullPointerException。所以思考了一下決定用android自帶的異步處理機(jī)制:Handler,進(jìn)行消息的回調(diào)。
private void downloadImage() {
new Thread(new Runnable() {
@Override
public void run() {
final Bitmap bitmap= ServerImage.downloadFile(); //在線獲取圖片
Looper.prepare();
Message message=new Message();
message.what=0;
message.obj=bitmap;
handler.sendMessage(message);
Looper.loop();
}
}).start();
}
class ImageHandler extends Handler{
@Override
public void handleMessage(Message msg){
//編寫自定義邏輯
switch (msg.what){
case 0:{
}
}
}
}
其中switch中的case與調(diào)用handler時(shí)定義的msg.what要嚴(yán)格一致。
handler對(duì)象的定義
定義的時(shí)候注意一點(diǎn):要在子線程外定義。
我嘗試過(guò)在子線程內(nèi)定義,結(jié)果在把handler里面得到的圖片賦值給UI組件時(shí)發(fā)生java.lang.NullPointerException。不清楚什么原因,但是確實(shí)挺有趣的,有時(shí)間會(huì)探求一下里面的原理。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。