Android基礎知識總結(一)
1、記憶體溢位和記憶體洩露有什麼區別
記憶體溢位:應用的記憶體已經已經達到系統設定的最大值,進而導致崩潰
記憶體洩露:應用使用資源之後沒有及時釋放,導致應用記憶體中持有了不需要的資源,通常都是由於記憶體洩露導致記憶體溢位。
2、wait()和sleep()的區別
①這兩個方法來自不同的類分別是Object和Thread
②sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
③wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在任何地方使用
④sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法
3、ListView的優化方案
①重用 convertView
②用 ViewHolder 避免在 getView 中有 重複呼叫的 findViewById
③設定 View (如 TextView#setText )之前先對比資料是否有改變(重繪代價大)
④避免在 getView 函式中直接載入 Image 或做其他比較耗時的操作
⑤ListView 中元素避免半透明(半透明繪製需要大量乘法計算)
⑥儘量開啟硬體加速
⑦ 用威力加強版 RecyclerView代替ListView
4、註冊廣播有幾種方式,這些方式有何優缺點
①在應用程式的程式碼中註冊
當BroadcastReceiver更新UI,通常會使用這樣的方法註冊。啟動Activity時候註冊BroadcastReceiver,Activity不可見時候,取消註冊。
②在AndroidManifest.xml當中註冊,是常駐型廣播,程式關閉後,如果有資訊廣播來,程式也會被系統呼叫自動執行。缺點是廣播始終處於活動狀態,對cpu和電量耗費相對較高。
5、執行緒的幾種狀態,分別是哪些
java中,執行緒通常有五種狀態,建立,就緒,執行、阻塞和死亡狀態。
①建立:生成執行緒物件,並沒有呼叫該物件的start方法執行緒就會被建立
②就緒:呼叫start建立後執行緒就會處於就緒狀態,或者執行緒從等待或者睡眠中回來之後,也會處於就緒狀態
③執行:執行緒排程程式將處於就緒狀態的執行緒設定為當前執行緒,此時執行緒就進入了執行狀態,開始執行run函式當中的程式碼
④阻塞:執行緒正在執行的時候被暫停,sleep,suspend,wait等方法都可以導致執行緒阻塞。
⑤死亡:執行緒的run方法執行結束或者呼叫stop方法後該執行緒就會死亡
6、什麼是ANR如何避免它?
Application Not Responding也就是在規定的時間內,沒有響應。
原因:
①在5秒內沒有響應輸入的事件(例如,按鍵按下,螢幕觸控)
②BroadcastReceiver在10秒內沒有執行完畢。
避免方法:
①在Activity的onCreate()和onResume()減少耗時操作
②將耗時任務放到非UI執行緒執行然後用handler來更新UI執行緒
③避免在onReceiver裡面做過多操作
④避免在Intent Receiver裡啟動一個Activity,因為它會建立一個新的畫面,並從當前使用者正在執行的程式上搶奪焦點。
7、如果後臺的Activity由於某種原因被系統回收了,如何在被系統後手之前儲存當前狀態
①Activity中提供了一個方法:onSavedInstanceState(Bundle bundle),當系統銷燬一個Activity時,會將Activity的狀態資訊已鍵值對形式存放在bundle物件中
②當系統重新回到被回收的Activity時會呼叫這個Activity的onCreate方法,並把bundle物件傳遞過去
8、執行緒間通訊的兩種方式是什麼及原理?
Android執行緒間通訊主要指UI執行緒與子執行緒間的通訊。Android執行緒間通訊的方式主要有兩種,一種是通過MessageQueue機制實現通訊;一種是使用非同步任務AsyncTask。
①Message Queue是一個訊息佇列,用來存放通過Handler釋出的訊息。Android在第一啟動程式時會預設會為UI thread建立一個關聯的訊息佇列,可以在自己的子執行緒中建立Handler與UI thread通訊
② AsyncTask:首先繼承一下此類,實現以下若干方法
onPreExecute(),doInBackground(Params…),onProgressUpdate(Progress…),onPostExecute(Result)
9、final,finally,finalize的區別
①final—修飾符(關鍵字)。如果一個類被宣告為final,將不能作為父類被繼承。將變數或方法宣告為final,可以保證它們在使用中不被改變。將方法被宣告為final後不能過載。
②finally—在異常處理時提供 finally 塊來執行任何清除操作。
③finalize—方法名。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除物件之前對這個物件呼叫的。
10、Android中asset資料夾和raw資料夾的區別
①資源對映:res/raw中的檔案會被對映到R.Java檔案中,assets中的檔案不會被對映。
②目錄結構:res/raw不可以有目錄結構,而assets則可以有目錄結構(可以再建其他資料夾)
③目錄用途:res/raw一般存放一些音視訊檔案,assets一般存放html,js,css和資料檔案
④訪問方式:
res/raw訪問使用R.id.filename
InputStream in = context.getResources().openRawResource(R.id.filename);
assets訪問方式
InputStream in = context.getResources().getAssets().open(fileName);