android進階知識點記錄

      大晚上的有些睡不着,準備記錄點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)//通過對應字段取出

     暫時記錄這些問題點,以後有添加必要的話會在此基礎上進行修改,廣大的讀者有好的建議,歡迎發表評論,本人將很高興接受。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章