大晚上的有些睡不着,準備記錄點android比較重要的知識點,也是平常會遇到的問題點。我們做android開發除了掌握基礎知識之外,比較深入點的知識也需要個人在實際中去實踐才能真正理解其作用,單靠記憶只是幾天或者一兩週的效果,很容易忘記。因此在工作之餘記錄所遇到的問題或者比較好的技術可以記錄記錄,這也許在以後就是你一份寶貴的財富。好了,廢話少說,下面我簡單記錄下我個人覺得比較重要的知識點。
1.android子線程使用Handler:
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Looper.prepare();
......
Looper.loop();
}
};
2.服務service被綁定後,如何才能在綁定的一端被阻塞後服務端不被阻塞:
在aidl文件方法前面添加關鍵字oneway
3.線程死鎖:
java中導致死鎖的原因 多個線程同時被阻塞,它們中的一個或者全部都在等待某個資源被釋放,而該資源又被其他線程鎖定,從而導致每一個線程都得等其它線程釋放其鎖定的資源,造成了所有線程都無法正常結束。
死鎖產生的四個必要條件:
1 )、互斥使用,即當資源被一個線程使用(佔有)時,別的線程不能使用
2 )、不可搶佔,資源請求者不能強制從資源佔有者手中奪取資源,資源只能由資源佔有者主動釋放。
3 )、請求和保持,即當資源請求者在請求其他的資源的同時保持對原有資源的佔有。
4 )、循環等待,即存在一個等待隊列:P1佔有P2的資源,P2佔有P3的資源,P3佔有P1的資源。這樣就形成了一個等待環路。
解決辦法:
避免在一個同步方法中調用其它對象的延時方法和同步方法,也要慎用鎖。
4.Handler 弱引用,防止內存泄漏
private static class MyHandler extends Handler {
WeakReference<MainActivity> weakReference ;
public MyHandler(MainActivity activity ){
weakReference = new WeakReference<MainActivity>( activity) ;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if ( weakReference.get() != null ){
// update android ui
}
}
}
Activity對象被設置爲弱引用,當Activity被銷燬時就直接被回收了,不存在handler還擁有其引用導致無法釋放問題,同理在線程中或者其他對象持有activity引用時候也是可以這樣處理的,可以被立即釋放不會導致內存泄漏。
5.Service服務是運行在主線程中,生命週期中不能做耗時操作,如果需要做耗時操作,可以使用如下兩種方式:
1):另起線程做耗時操作
2):使用IntentService(Android封裝好,可以在方法onHandleIntent(Intent)做耗時處理,並且他在工作執行完畢後自動銷燬)
6:Binder通訊原理和使用方法:
基於C/S架構的,包含4個角色:Client、Server、Binder驅動ServiceManager,通信過程:
1 )Server向ServiceManager註冊。Server通過Binder驅動向ServiceManager註冊,聲明可以對外提供服務。ServiceManager中會保留一份映射表。
2 )Client向ServiceManager請求Server的Binder引用。Client想要請求Server的數據時,需要先通過Binder驅動向ServiceManager請求Server的Binder引用(代理對象)。
傘向具體的Server發送請求。Client拿到這個Binder代理對象後,就可以通過Binder驅動和Server進行通信了。
3 )Server返回結果。Server響應請求後,需要再次通過Binder驅動將結果返回給Client。
使用方法:
public static void addService(String name, IBinder service)//通過addService將服務保存在全局變量service_list中
IBinder binder = ServiceManager.getService(xxx)//通過對應字段取出
暫時記錄這些問題點,以後有添加必要的話會在此基礎上進行修改,廣大的讀者有好的建議,歡迎發表評論,本人將很高興接受。