1. 程式人生 > >Android基礎知識總結(一)

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);