Android面試知識點歸納

一、ListView的優化處理
    (1)複用getView(View convertView)中的View對象
    分析:每次填充數據時都會創建一個View對象
LayoutInflater mInflater = LayoutInflater.from(context);
convertView = this.mInflater.inflate(R.layout.datatemp_planview, null);  
首次創建convertView對象後,下次即可複用。
 
(2)ViewHolder類的使用
分析:創建輔助類ViewHolder,可減少FindViewById的使用,減少內存開銷.
convertView.setTag(viewHolder);
viewHolder=convertView.getTag();
 
(3)數據分批加載
分批加載數據,需要時再加載下一頁,縮短等待時間
 
(4)分頁加載
針對大量數據的情況比如10萬條數據,一次性加載或者分批加載都可能導致OOM,這時
需要使用分頁加載,比如分成1000頁,每頁數據覆蓋上一頁的數據,每頁再採用分批
加載,大大縮小內存需求
 
二、OOM是什麼,如何避免
Out Of Memory(OOM):內存泄漏。
原因:(1)對象佔用大量內存,如BitMap
 (2)對象得不到釋放,如IO流、數據庫Cursor沒有關閉;Bitmap使用後未調用recycle()。 
    避免措施:(1)強制關閉IO流和數據庫Cursor
 (2)壓縮圖片:BitmapFactory.Optiions的inJustDecodeBounds可做邊界壓縮,設置
Options.inSampleSize可設置壓縮比
 (3)調用第三方開源庫Universal-Image-Loader加載大圖片,可實現圖片的三級緩存
。其維護了一個LinkedHashMap和maxSize;可將當前的size與maxSize來移除最早
圖片。

三、圖片的預加載
在加載大圖片時往往比較耗費時間,這時需要顯示一張未加載成功時的圖片,等到請求的圖片加載成功
再爲ImageView設置資源。

四、AsyncTask的工作原理
AsyncTask是異步處理的封裝類,使用該類可以不去關心handler和Thread,其主要的方法包括:
onPreExecute():在UI線程中調用,Task一啓動便調用這個方法,可以在該方法中建立一個任務
doInBackground(Params...):在後臺線程中調用,該方法中可以做一些耗時的事情,文件、數據庫操作等,
可通過publishProgress(Progress...)方法來調用當前任務的進度
onProgressUpdate(Progress...):在UI線程中運行,用來執行與UI相關的操作
onPostExecute(Result):Task結束時調用,運行在UI線程
cancel():取消任務,可用isCancel()來判斷當前任務是否取消,調用cancel()後不再調用onPostExecute();
注意事項:
(1)onPreExecute、doInBackground、onProgressUpdate、onPostExecute等方法不需要手動調用
(2)AsyncTask對象必須在UI線程中創建,execuse()方法必須在UI線程中調用
(3)任務只能調用一次

五、Handler機制
Handler:處理者,負責消息的發送和處理
Message:信息體
MessageQueue:消息隊列,先進先出
Looper:隊列管理者,負責向MessageQueue中添加和獲取Message,通過Looper.prepare()和Looper.loop()
  實現消息輪詢
Thread:負責消息調度

六、Fragment的生命週期函數
onAttach():Activity與Fragment建立綁定
onCreate():創建Fragment
onCreateView():初始化界面,創建Fragment界面
onActivityCreated():當Activity的onCreate()方法被調用
onStart():開啓Fragment
onResume():Fragment在Activity中可見
onPause():Fragment透明
onStop():Fragment被刪除,但仍然中內存中
onDestroyView():Fragment的佈局被刪除
onDestroy():Fragment被刪除
onDetach():Activity與Fragment解除綁定

七、SQLite的應用
(1)創建數據庫管理類MySqlExecuse extends SQLiteOpenHelper
(2)獲得SQLiteDatabase對象  db=mySqlExecuse.getWritableDatabase();
(3)db.insert() query() delete() update();

八、Andorid的mvc設計模式
MVC:Mode View Controller 
Mode:數據處理層,業務邏輯層
View:界面顯示層
Controller:業務控制層,通常爲Activity,響應時間爲5s,所以儘量讓Activity簡單,將邏輯封裝到Mode層

九、Android下的國際化理解
只需要在value文件加下定義如下的xml文件:values-zh,values-en,values-js...等等,格式values-國家代碼

十、強引用、軟引用、弱引用、虛引用
強引用:new 一個對象,只要改對象在使用中就不會被GC回收
軟引用:SoftReference<Object> 內存不足時回收,常用於圖片緩存
弱引用:WeakReference<Object> 只要檢測到就回收
虛引用:PhantomReference<Object> 任何時候都可能被回收 必須和ReferenceQueue聯合使用,被回收時如果該
對象持有虛引用,則會將這個虛引用添加在ReferenceQueue中,故可以通過檢測ReferenceQueue中是否有
該應用可以跟蹤對象是否被回收

十一、Intent 信使
屬性:Action、Data、Category、Type、Compent、Extra
Action:要執行的動作,字符串方式存在
Data:執行動作的URI和MIME類型
Category:Action的附加信息
Type:顯式指定Intent的數據類型(MIME)
Extra:添加附加信息,常用來傳遞數據
Compent:組件名稱


十二、OSI七層模型和TCP/IP模型
OSI:Open System Interconnect 簡稱OSI,包括:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層
TCP/IP:網絡接入層、網際互聯層、傳輸層、應用層
網際互聯層:包括 網際協議IP、互聯網組管理IGMP、互聯網組報文ICMP
傳輸層:傳輸控制協議TCP、用戶數據報協議UDP


十三、Socket通信
客戶端:Socket scoket=new Socket(ip,port);
服務端:ServerSocket serverSocket=new ServerSocket(port);
Socket socket=serverSocket.accept()
 
十四、HTTP協議
Hyper Text Transfer Protocol的縮寫HTTP(超文本傳輸協議),由W3C制定和維護,版本1.0 1.1
響應碼:
200:一切正常
302/307:請求的資源路徑變更了
304:資源沒有被修改過
404:資源不存在,找不到資源
500:服務器程序有錯

十五、Android線程池
ThreadPoolExecutor(int corePoolSize,                    //核心線程池大小
                       int maximumPoolSize,                 //最大線程池大小
                       long keepAliveTime,                  //線程池中,超過corePoolSize的空閒線程存活的時間
                       TimeUnit unit,                       //時間單位
                       BlockingQueue<Runnable> workQueue,   //阻塞任務隊列LinkBlockingQueue ArrayBlockingQueue
                       ThreadFactory threadFactory,         //負責創建線程的工廠
                       RejectedExecutionHandler handler){ } //提交任務數大於maximumPoolSize+workQueue時,交由
//RejectedExecutionHandler處理

    四種常用線程池:
newFixedThreadPool             //固定大小線程池,超過的任務緩存在LinkedBlockingQueue中,無界
newCachedThreadPool            //緩存功能的線程池,使用SynchronousQueue,任務提交後創建新的線程
newSingleThreadExecutor        //單線程池,LinkedBlockingQueue,保證任務由一個線程順序執行
ScheduledThreadPoolExecutor    //定時功能的線程池,DelayedWorkQueue無界

十六、Android中去除標題
(1)代碼添加:requestWindowFeature(Window.FEATURE_NO_TITLE);在setContentView()之前
(2)AndroidManifest.xml文件中在<application>或者<activity>中<android:theme="@android:style/Theme.NoTitleBar">
(3)style.xml中添加樣式:<item name="android:windowNoTitle">true</item> 然後在AndroidManifest.xml中添加樣式

十七、Android適配
方案(1):圖片適配,可在res文件夾的drawable文件夾下存放多種像素密度的圖片
方案(2):字體適配:在res文件夾下的values文件夾下建立value-像素密度的文件,如:demens-800x480,dimens-1280x720
方案(3):佈局適配:在layout的文件夾下建立 layout-密度的文件,如 layout-800x480,layout-1280x720 不常用
方案(4):java代碼適配:通過API獲得當前屏幕的寬和高,按比例分配屏幕中控件的高寬,如果控件較多就變得不現實
方案(5):權重適配:通過權重對控件進行佈局可實現一份佈局多處適用
 
注意事項:(1)單位採用dp
  (2)採用相對、線性、幀佈局
  (3)採用ScrollView包裹內容過多的控件
  (4)在AndroidManifest.xml中添加:
<supports-screens
android:largeScreens="true"
android:normalScreens="true" 
android:smallScreens="true"
android:anyDensity="true">
</supports-screens>
 
十八、Android下的四種啓動模式
standard:每次startActivity都創建一個新的Activity
singleTop: 單一頂部,如果要創建的Activity已經在頂部則調用onNewIntent()複用當前的Activity,而不是創建新的
singleTask:單一任務棧,如果要創建的Activity已經在當前任務棧中則複用該Activity,如果不在頂端則將其上的Activity移除
singleInstance:單例,只會運行在自己獨立的任務棧中,該任務棧只有該單例存在

十九、Android 切屏
(1)不設置Activity的android:configChanges時,onpause--onStop--onDestroy--onCreate--onStart--onResume
切屏會重新調用Acivity的生命週期,橫屏1次,豎屏2次
(2)設置Activity的android:configChanges="orientation" 橫豎切屏各執行一次生命週期函數
(3)設置Activity的android:configChanges="orientation|keyboardHidden"時,不會執行,只會調用onConfigurationChanged方法
(4)android:configChanges=”orientation|screenSize|keyboardHidden”
寫死:android:screenOrientation=”landscape”橫屏或者portrait豎屏,指定應用爲橫屏或者豎屏
代碼設置:setRequestOrientation(ActivityInfo.screen_orientation_landscape|portrait);
 
二十、Dalvik和java的JVM
 1、架構不同:JVM使用棧架構;Dalvik使用的是寄存器,數據是加載到CPU的寄存器上的。
 2、JVM加載的.class文件,Dalvik加載的是.dex文件,對內存的分配情況做了優化。
Android:.java-->.class-->.dex-->.apk
Java:   .java-->.class-->.jar
 
二十一、Java中jvm的內存分配
 堆區:new 出來的對象,每個對象對應一個class文件,反射時便是通過這個class文件來找到類中的信息
 棧區:基本數據類型、對象的引用,每個線程包含一個棧區,彼此之間不能訪問
 共享區域:存放整個應用中唯一的元素
 
二十二、一個對象在內存中產生過程
Person persoon=new Person();
A 因爲new用到了Person.class類,所以先找到Person.class類文件,並加載到內存的方法區中
B 執行該類的static代碼塊。如果有的話,給Person.class類進行初始化
C new Pseron()在堆內存中開闢空間,分配內存地址。
D 在堆內存中的建立對象的特有屬性,並進行默認的初始化。
E 對屬性進行顯示初始化。
F 對對象進行構造代碼塊初始化。
G 對對象進行對應的構造函數初始化。
H 將堆內存地址賦給棧內存中P變量。
 
二十三、抽象類與接口
共性:都是抽象的概念
不同:
   (1)抽象類與實現之間是繼承關係,而接口與實現之間是實現關係
   (2)抽象只能被單繼承,接口可實現多個
   (3)抽象類是對事物的抽象,接口是對行爲的抽象
   (4)抽象類可以有自己的靜態代碼塊和方法,接口中只能有抽象的方法
   (5)抽象類可以定義抽象方法供子類直接使用,也可以定義非抽象方法
   (6)接口中的方法子類需要全部實現,抽象類則不需要

二十四、java中的三大特性
    封裝:將對象封裝成一個類,並將屬性和行爲封裝成該類的成員與方法,實現高內聚
繼承:多個對象具有相同的屬性和行爲,則通過繼承父類來實現
多態:繼承同一父類或實現同一接口的對象具有不同的表現形態
 三種方式:實現接口、繼承父類、重寫方法

二十五、final、finally、finalize
    final:修飾符,被修飾的類、方法、變量不能被繼承、重寫、改變
finally:異常處理語句塊,除了遇到system.exit(0),其他情況在方法結束前都會被調用,用於釋放資源
Finalize:垃圾回收方法,被GC調用

二十六、StringBuffer與StringBuilder
(1)StringBuffer有鎖機制,是線程安全的,而StringBuilder沒有鎖,是線程不安全的
(2)StringBuilder比StringBuffer效率高,故單線程使用StringBuilder,多線程使用StringBuffer

二十七、Collections與Collection的區別
Collections是集合的工具類,其中包含大量集合的操作方法,而Collection是集合的頂級接口,

二十八、java 線程狀態
1. 新建狀態(New):新創建了一個線程對象。
2. 就緒狀態(Runnable):線程對象創建後,其他線程調用了該對象的start()方法。該狀態的線程位於可運行線程池中,變得可運行,等待獲取CPU的使用權。
3. 運行狀態(Running):就緒狀態的線程獲取了CPU,執行程序代碼。
4. 阻塞狀態(Blocked):阻塞狀態是線程因爲某種原因放棄CPU使用權,暫時停止運行。直到線程進入就緒狀態,纔有機會轉到運行狀態。阻塞的情況分三種:
(一)、等待阻塞:運行的線程執行wait()方法,JVM會把該線程放入等待池中。
(二)、同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程佔用,則JVM會把該線程放入鎖池中。
(三)、其他阻塞:運行的線程執行sleep()或join()方法,或者發出了I/O請求時,JVM會把該線程置爲阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。
5. 死亡狀態(Dead):線程執行完了或者因異常退出了run()方法,該線程結束生命週期。


二十九、Java多線程中Sleep與Wait的區別
   (1)Thread.sleep()   Object.wait()
   (1)Sleep不釋放鎖,wait釋放鎖
   (2)wait和notify需要在同步代碼塊中調用,而Sleep不用
   (3)sleep需要捕獲異常,wait不需要
   
三十、volley應用

三十一、富文本
將字符串解析成html數據塊
Spanned spanned = Html.fromHtml(str);
 
三十二、EventBus框架
替代handler實現線程間通信的總線框架,基於訂閱發佈模式。
包括:訂閱者、發佈者、事件、總線
EventBus.getDefault().register(this);//訂閱事件
EventBus.getDefault().post(object);//發佈事件
EventBus.getDefault().unregister(this);//取消訂閱

onEventMainThread代表這個方法會在UI線程執行
onEventPostThread代表這個方法會在當前發佈事件的線程執行
BackgroundThread這個方法,如果在非UI線程發佈的事件,則直接執行,和發佈在同一個線程中。如果在UI線程發佈的事件,則加入到一個後臺的單線程隊列中去。

三十三、圖片三級緩存
緩存LruCache、文件、網絡,依次獲取文件。

三十四、MD5加密
不可逆的加密,只能加密不能解密。

三十五、數據緩存
讀取網絡服務器中的數據,並緩存在本地,下次讀取數據時首先獲取本地的數據,請求服務器最新的數據,獲取成功則覆蓋本地數據,失敗則顯示緩存在本地的數據。
數據存儲:
持久化: 本地文件、SQLite、sharedPreference、contentprovider
非持久化:內存

三十六、listView響應監聽
listView.setOnItemClickListener()  //item監聽
adapter.notifyDataSetChanged()     //數據刷新

三十七、xutil框架


三十八、手機分辨率等級
參照以上方式可將市場上大多數手機劃分爲5個像素密度等級,分別爲:
     ldpi:120dpi,像素密度與dp轉換關係爲:1dp = 0.75px
     mdpi:160dpi    ,像素密度與dp轉換關係爲:1dp = 1px
     hdpi:240dpi,像素密度與dp轉換關係爲:1dp = 1.5px
     xhdpi:320dpi,像素密度與dp轉換關係爲:1dp = 2px
     xxhdpi:480dpi,像素密度與dp轉換關係爲:1dp = 3px

三十九、排序時間複雜度
(1)選擇排序 O(n^2)
(2)插入排序O(n^2)
(3)冒泡排序O(n^2)
(4)堆排序O(nlogn)
(5)並歸排序O(nlogn)
(6)快速排序  最理想O(nlogn) 最差O(n^2)
(7)希爾排序  O(nlogn)最差時間O(n^s) 1<s<2


四十、堆排序
(1)初始化堆,大頂堆或者小頂堆,此處以大頂堆爲例
(2)堆調整,從最後一個非葉節點開始調整
(3)排序,將頂節點與最後一個未交換過位置的節點調換
(4)堆調整,從第二個節點開始調整,(3)中已排好序的節點不再調整
參考:http://blog.csdn.net/xiaoxiaoxuewen/article/details/7570621/


四十一、快速排序
    (1)選擇一個key,通常爲第一個。
(2)從後往前收索將大於key的放在其右邊,從前往後收索將小於key的放在其左邊,知道前後搜素的下邊相等
(3)分別對key前面的數組和後面的數組採用(2)的方法搜索,直到前後數組的長度爲1。

四十二、希爾排序
(1)設置增量長度的一半
(2)按增量對數據進行比較
(3)縮小增量爲上一次的一半重複(2),直至增量縮小爲1
參考:http://www.cnblogs.com/jingmoxukong/p/4303279.html


本文參考:http://blog.csdn.net/u014745194/article/details/51344210















發佈了30 篇原創文章 · 獲贊 21 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章