Android之多線程和異步任務
為什么要用多線程
1.提高用戶體驗或者避免ANR
2.異步
應用中有些情況下并不一定需要同步阻塞去等待返回結(jié)果,可以通過多線程來實現(xiàn)異步,例如你的應用中的某個Activity需要從云端獲取一些圖片,加載圖片比較耗時,這時需要使用異步加載骑冗,加載完成一個圖片刷新一個。
3.多任務
多任務下載
后兩點與java中的多線程應用沒有太大的區(qū)別
什么事ANR
Application Not Responding 意思是程序未響應先煎。如果一個應用無法響應用戶的輸入贼涩,系統(tǒng)就會彈出一個ANR對話框
Android應用程序的main線程,它負責處理UI的繪制榨婆,Android系統(tǒng)為了防止應用程序反應較慢導致系統(tǒng)無法正常運行做了一個處理磁携,一種情況是當用戶輸入事件在5秒內(nèi)無法得到響應,那么系統(tǒng)會彈出ANR對話框良风,由用戶決定繼續(xù)等待還是強制結(jié)束應用程序檬洞,另一種情況是BroadcastReceiver超過10秒沒執(zhí)行完也會彈出ANR對話框岩饼。
事件處理原則
所有可能耗時的操作都放到其他線程去處理
Android中的Main線程不能處理耗時的事件拳芙,否則后續(xù)的事件無法在5面內(nèi)得到響應瞒渠,就會彈出ANR對話框,那么哪些方法會在Main線程中執(zhí)行呢疑俭?
1.Activity的生命周期方法粮呢,例如onCreate,onStart钞艇,onResume等
2.事件處理方法啄寡,例如onClick,onItemClick等
多線程
1.繼承Thread類實現(xiàn)多線程
2.實現(xiàn)Runnable接口方式實現(xiàn)多線程
兩者之間的區(qū)別:
一個類只能繼承一個父類哩照,存在局限挺物,但一個來可以實現(xiàn)多個接口。
實現(xiàn)Runnable接口適合于資源共享
public class Thread extends Object implements Runnable
可以看出Thread類也是Runnable接口的子類
new Thread的弊端
1.每次new Thread新建對象性能差
2.線程缺乏統(tǒng)一管理飘弧,可能無限制新建線程识藤,相互之間競爭砚著,及可能占用過多系統(tǒng)資源導致死機或oom
3.缺乏更多功能,如定時執(zhí)行痴昧, 定期執(zhí)行稽穆,線程中斷
Java線程池
1.newCachedThreadPool
創(chuàng)建一個可緩存線程池,如果線程池長度超過處理需要赶撰,可靈活回收空閑線程舌镶,若無可回收,則新建線程扣囊。
2.newFixedThreadPool
創(chuàng)建一個定長線程池乎折,可控制線程最大并發(fā)數(shù),超出的線程會在隊列中等待侵歇。
3.newSingleThreadExecutor
創(chuàng)建一個單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任務
4.newScheduledThreadPool
創(chuàng)建一個定長線程池吓蘑,支持定時及周期性任務執(zhí)行
異步消息處理機制
線程與線程之間如何通訊
Android SDK提供的幾個線程簡通訊的類
1.Handler
Handler在android里負責發(fā)送和處理消息惕虑,通過它可以實現(xiàn)其他線程與Main線程之間的消息通訊。
2.Looper
Looper負責管理線程的消息隊列和消息循環(huán)磨镶。
3.Message
Message是線程間通訊的消息載體溃蔫。
4.MessageQueue
MessageQueue是消息隊列,先進先出琳猫,它的作用是保存有待處理的消息
四者之間的關(guān)系是:在其他線程中調(diào)用Handler.sendMessage方法(參數(shù)是Message對象)伟叛,將Main線程需要處理的事件添加到Main線程的MessageQueue中,Main線程通過MainLooper從消息隊列中取出Handler發(fā)過來的消息脐嫂,會回調(diào)Handler的handleMessage方法
Handler的send系列方法
1.sendEmptyMessage(int)
2.sendMessage(Message)
3.sendMessageAtTime(Message,long)
4.sendMessageDelayed(Message,long)
Handler的post方法
1.post(Runnable)
2.postAtTime(Runnable,long)
3.postDelayed(Runnable long)
post方法允許你安排一個Runnable對象到主線程隊列中统刮,等待執(zhí)行
以下幾種方法可以在子線程中進行UI操作
1、View的post方法
public boolean post(Runnable action) {
Handler handler;
if(mAttachInfo != null){
handler = mAttachInfo.mHandler;
}else{
ViewRoot.getRunQueue().post(action);
return true;
}
return handler.post(action);
}
2.Activity的runOnUiThread方法
AsyncTask
異步任務账千,將耗時的操作放在異步任務中來執(zhí)行侥蒙,并隨時將任務執(zhí)行的結(jié)果返回給我們的UI線程
滑動輪播圖片的實現(xiàn)方式
1.欺騙適配器
將適配器的getCount的值設(shè)置為最大值
2.構(gòu)造數(shù)據(jù)源
有五張圖片,實現(xiàn)無線循環(huán)匀奏。在viewpager中設(shè)置7個view鞭衩,第一個為五張圖片的最后一張, 第七章為五張圖片的第一張娃善,圖片順序如下數(shù)字:
4-0-1-2-3-4-0
0-1-2-3-4 為正產(chǎn)的五張圖片论衍,4,0為添加的兩個圖片view
滑動的順序:進入頁面顯示0圖片,向右滑動到0頁設(shè)置為0聚磺,則可以繼續(xù)向右滑動坯台,同理向左滑動到4時,將4頁設(shè)置為4咧最。