標籤:
Android‘s Dalvik Java 與 Java SE 進行比較Java代碼最佳化記憶體管理與分配Android的多線程操作Android’s Dalvik Java 與 Java SE 進行比較:
@、Dalvik虛擬機器是register-based machine;Java SE虛擬機器是stack machine。
@、從Android 2.2 版本開始引進JIT(Just In Time)編譯器,之前是純解譯器。
@、Android SDK 使用dx這個工具把Java SE stack machine byte-code 轉換為 Dalvik register-based machine byte-code.(IDE自動完成此步驟)
@、Dalvik VM 能夠在同一個虛擬機器上運行多個執行個體(running in multiple instances on the same machine.)。系統啟動時開啟第一個執行個體,叫做zygote,它控制了其它所有執行個體。
Java代碼最佳化:
@、java.util.concurrent包中有許多已經實現並發控制的類,因此,在寫代碼前先確認下是否有滿足需求的類而不是直接去自訂一個類來控制並發。
@、java.util.concurrent.locks包中提供了讀寫鎖的控制類(ReentrantReadWriteLock),而不需要通過使用synchronized來保證安全執行緒。
記憶體管理與分配:
@、不要在迴圈中建立新對象,這樣會給GC帶來過度的開銷。
@、通過static factory method方式來實現按需指派至。可參考書籍《Effective Java》,或者可參考Android源碼中Message、MotionEvent、Parcel等類的實現方式。
Android的多線程操作:
@Thread:
1、 直接繼承Thread類。
2、 實現Runnable介面。通過Activity的runOnUiThread方法實現與主線程的互動。
3、 因為start方法一個Thread執行個體只能調用一次,所以需要每次都建立Thread對象來完成操作。這樣帶來了過多的開銷,因此不推薦使用此方法。
@、AsynTask:
1、 onPreExecute、doInBackground、onProgressUpdate、onPostExecute。
2、 onXXX都是在主線程執行,doInBackground不是。
3、 在doInBackground中調用publishProgress方法來觸發onProgressUpdate事件。
4、 此方式的產生的實際線程是由ExecutorService在後台管理。
5、 此方式很容易就實現在獨立的線程裡完成長時間操作,而不影響主線程。
6、 此方式每次操作都需要建立新的對象,因此不適合需要頻繁調用的情境,否則增加GC的開銷。適合類型檔案下載這樣不頻繁的操作。
@、Handler:
1、 Acitvity實現Handler.Callback介面,在handleMessage方法中完成需要的操作,可通過方法入參message的what欄位作為switch-case語句的標誌,來完成不同的操作。注意;在方法的末尾加上message.recycle(); 這樣就可以重用Message執行個體,而不要重複建立過多的Message執行個體。
2、 建立HandlerThread對象(handlerThread)。
3、 建立Handler對象(mHandler = new Handler(handlerThread.getLooper(),this))。
註:2、3步驟可在onCreate實現。
4、 線程有Looper類進行維護,迴圈執行,直到手動執行終止(可在onPause事件中調用mHandle.getLooper().quit())。
5、 需要與主線程互動的,可以在增加一個Handler對象(mMainHandler = new Handler(getLooper(), this))負責與主線程的互動。
6、 通過Handler的各種sendXXX方法完成訊息傳遞,最終由handleMessage方法完成對訊息的操作。
Android Programming: Pushing the Limits -- Chapter 2: Efficient Java Code for Android