知識點歸總

基本知識

1.靜態方法可以重寫嗎


父類的普通方法可以被繼承和重寫,不多作解釋,如果子類繼承父類,而且子類沒有重寫父類的方法,但是子類會有從父類繼承過來的方法。

靜態的方法可以被繼承,但是不能重寫。如果父類中有一個靜態的方法,子類也有一個與其方法名,參數類型,參數個數都一樣的方法,並且也有static關鍵字修飾,那麼該子類的方法會把原來繼承過來的父類的方法隱藏,而不是重寫。通俗的講就是父類的方法和子類的方法是兩個沒有關係的方法,具體調用哪一個方法是看是哪個對象的引用;這種父子類方法也不在存在多態的性質。《Java編程思想》中這樣提到“只有普通的方法調用可以是多態的”。 

何爲靜態?靜態方法是類在加載時就被加載到內存中的方法,在整個運行過程中保持不變,因而不能重寫。但非靜態方法是在對象實例化時才單獨申請內存空間,爲每一個實例分配獨立的運行內存,因而可以重寫。

2.ArrayList和Vector的主要區別是什麼?

1、Vector是多線程安全的,而ArrayList不是,這個可以從源碼中看出,Vector類中的方法很多有synchronized進行修飾,這樣就導致了Vector在效率上無法與ArrayList相比;

2、兩個都是採用的線性連續空間存儲元素,但是當空間不足的時候,兩個類的增加方式是不同的,很多網友說Vector增加原來空間的一倍,ArrayList增加原來空間的50%,其實也差不多是這個意思,不過還有一點點問題可以從源碼中看出,一會兒從源碼中分析。

3、Vector可以設置增長因子,而ArrayList不可以,最開始看這個的時候,我沒理解什麼是增量因子,不過通過對比一下兩個源碼理解了這個,先看看兩個類的構造方法:

3.RemoteView在哪些功能中使用

桌面小部件則是通過AppWidgetProvider來實現的,AppWidget本質是一個廣播.

通知欄和桌面小部件的開發過程中都會用到RemoteView,它們在更新界面時無法像在Activity裏面那樣直接更新View,這是因爲兩者的界面都運行在其他線程中,確切的說是系統的SystemServer進程.爲了跨進程更新界面,RemoteViews提供一系列set方法,並且這些方法只是View全部方法的子集,另外RemoteVIew支持的View類型也是有限的。

4.SurfaceView和View的區別是什麼?

surfaceView是在一個新起的單獨線程中可以重新繪製畫面,而View必須在UI的主線程中更新畫面。那麼在UI的主線程中更新畫面 可能會引發問題,比如你更新畫面的時間過長,那麼你的主UI線程會被你正在畫的函數阻塞。那麼將無法響應按鍵,觸屏等消息。當使用surfaceView 由於是在新的線程中更新畫面所以不會阻塞你的UI主線程。但這也帶來了另外一個問題,就是事件同步。比如你觸屏了一下,你需要surfaceView中 thread處理,一般就需要有一個event queue的設計來保存touch event,這會稍稍複雜一點,因爲涉及到線程同步。

5.講一下android中進程的優先級?

在Android中進程按優先級可以分爲五類,優先級從高到低排列: 
- 前臺進程 該進程包含正在與用戶進行交互的界面組件,比如一個Activity 
- 可視進程 該進程中的組件雖然沒有和用戶交互,但是仍然可以被看到 
- 服務進程 該進程包含在執行後臺操作的服務組件,比如播放音樂的進程 
- 後臺進程 該進程包含的組件沒有與用戶交互,用戶也看不到 
- 空進程 沒有任何界面組件、服務組件,或觸發器組件** 
Android系統是進程託管的,也就是說進程都是由系統來管理,系統會按照特定的算來來回收這些進程。在回收中秉承幾個原則 
1. 儘量延長進程的生命週期,不到必須的情況下不會回收,因爲系統回收進程會影響用戶體驗 
2. 按優先級從低到高進行回收 
3. 同等優先級的進程越近使用越晚回收。 
進程過一段時間後是會被回收的,但要遵循上面的這些原則,播放音樂的這個進程的優先級還是比較高的,所以被莫名其妙地回收的可能性不大,在播放音樂時平白無故地停止這樣的情況很少對吧?service和application的生命週期有關,只要進程被回收,那麼它所佔用的所有資源將被回收。

6.靜態變量持有Activity引用會導致內存泄露

仔細分析在一個靜態成員的變量中保留了Activity裏面的一個視圖,可惡的是視圖中保留了Context的引用,這個時候就產生了一個對象長期被引用,導致Activity無法被GC掉,Activity佔用的內存也無法被GC掉。這個時候內存溢出發生了。 
淺談Android開發中內存泄露與優化 
http://m.blog.csdn.net/article/details?id=50581404 
http://www.linuxidc.com/Linux/2015-12/126432.htm

7.jni的開發流程

eclipse的jni的開發, 
dnk環境搭建 
先要用編譯,在bin裏,用javah編譯,生成.h文件。 
編寫Android.mk文件 
用gunstep生成so文件。 
用Android studio 來開發jni

8多線程、同步異步、線程池

併發: 
多個用戶爭奪同一個資源(這個資源可以是服務器上的日誌,可以是執行某一此sql操作,可以使ftp服務器上的某個文件等,又或者是程序中的某一個全局變量,因此我們可以稱這種資源爲:全局資源); 
解釋: 
併發是在多個用戶請求同一個資源的時候,或者是程序本身多線程請求同一個資源的時候造成的。 
比如: 
一個財務系統,兩個人同時對總錢數進行操作,一個加10塊一個減100塊,注意這兩個操作是同時進行的,那系統就不知道是加還是減了,這是併發問題。或者,多個線程同時請求同一個資源,必然導致此資源的數據不安全,A線程修改了B線程的處理的數據,而B線程又修改了A線程處理的數理(線程安全)。

異步: 
A線程要請求某個資源,但是此資源正在被B線程使用中,因爲沒有同步機制存在,A線程 
仍然請求的到這個資源,A線程無需等待。 
同步: 
A線程要請求某個資源,但是此資源正在被B線程使用中,因爲同步機制存在,A線程請求 
不到,怎麼辦,A線程只能等待下去。

同步與異步: 
顯然,同步最安全,最保險的。而異步不安全,容易導致死鎖,這樣一個線程死掉就會導致整個 
進程崩潰,但沒有同步機制的存在,性能會有所提升。所以對於同步與異步必須有所取捨。

8.1線程池

8.2同步機制的實現

Java同步機制有4種實現方式:(部分引用網上資源)

① ThreadLocal ② synchronized( ) ③ wait() 與 notify() ④ volatile

目的:都是爲了解決多線程中的對同一變量的訪問衝突 
ThreadLocal 
ThreadLocal 保證不同線程擁有不同實例,相同線程一定擁有相同的實例,即爲每一個使用該 
變量的線程提供一個該變量值的副本,每一個線程都可以獨立改變自己的副本,而不是與其它線程的副本衝突。 
優勢:提供了線程安全的共享對象 
與其它同步機制的區別:同步機制是爲了同步多個線程對相同資源的併發訪問,是爲了多個線程之間進行通信;而 ThreadLocal 是隔離多個線程的數據共享,從根本上就不在多個線程之間共享資源,這樣當然不需要多個線程進行同步了。

volatile 
volatile 修飾的成員變量在每次被線程訪問時,都強迫從共享內存中重讀該成員變量的值。

而且,當成員變量發生變化時,強迫線程將變化值回寫到共享內存。 
優勢:這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。 
緣由:Java 語言規範中指出,爲了獲得最佳速度,允許線程保存共享成員變量的私有拷貝,而

且只當線程進入或者離開同步代碼塊時才與共享成員變量的原始值對比。這樣當多個線程同時與某

個對象交互時,就必須要注意到要讓線程及時的得到共享成員變量的變化。而 volatile 關鍵字就

是提示 VM :對於這個成員變量不能保存它的私有拷貝,而應直接與共享成員變量交互。 
使用技巧:在兩個或者更多的線程訪問的成員變量上使用 volatile 。當要訪問的變量已在

synchronized 代碼塊中,或者爲常量時,不必使用。 
線程爲了提高效率,將某成員變量(如A)拷貝了一份(如B),線程中對A的訪問其實訪問的

是B。只在某些動作時才進行A和B的同步,因此存在A和B不一致的情況。volatile就是用來避免這種

情況的。 volatile告訴jvm,它所修飾的變量不保留拷貝,直接訪問主內存中的(讀操作多時使用

較好;線程間需要通信,本條做不到)

Volatile 變量具有 synchronized 的可見性特性,但是不具備原子特性。這就是說線程能夠自

動發現 volatile 變量的最新值。Volatile 變量可用於提供線程安全,但是隻能應用於非常有限的

一組用例:多個變量之間或者某個變量的當前值與修改後值之間沒有約束。

您只能在有限的一些情形下使用 volatile 變量替代鎖。要使 volatile 變量提供理

想的線程安全,必須同時滿足下面兩個條件:

對變量的寫操作不依賴於當前值;該變量沒有包含在具有其他變量的不變式中。

sleep() vs wait() 
sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,把執行機會給其他線程,但是監

控狀態依然保持,到時後會自動恢復。調用sleep不會釋放對象鎖。 
wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖

定池,只有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池準備獲得對象鎖

進入運行狀態。

(如果變量被聲明爲volatile,在每次訪問時都會和主存一致;如果變量在同步方法或者同步塊中

被訪問,當在方法或者塊的入口處獲得鎖以及方法或者塊退出時釋放鎖時變量被同步。)

8.3 java同步機制:synchronized

9.view相關

9.1自定義view 
9.2圖表,柱狀圖 
9.3新特性view 
Android開發之RecyclerView的使用全解

10.http反饋碼

HTTP協議狀態碼錶示的意思主要分爲五類 ,大體是 : 
1××   保留 
2××   表示請求成功地接收 
3××   爲完成請求客戶需進一步細化請求 
4××   客戶錯誤 
5××   服務器錯誤

11.asyctask的實現原理

AsyncTask的本質是一個線程池,所有提交的異步任務都會在這個線程池中的工作線程內執行,當工作線程需要跟UI線程交互時,工作線程會通過向在UI線程創建的Handler(原理見:《Handler+Looper+MessageQueue深入詳解》)傳遞消息的方式,調用相關的回調函數,從而實現UI界面的更新。 
1、 AsyncTask的本質是一個靜態的線程池,AsyncTask派生出的子類可以實現不同的異步任務,這些任務都是提交到靜態的線程池中執行。

2、線程池中的工作線程執行doInBackground(mParams)方法執行異步任務

3、當任務狀態改變之後,工作線程會向UI線程發送消息,AsyncTask內部的InternalHandler響應這些消息,並調用相關的回調函數

12.handler的是怎樣實現的

handler不是不可以在子線程裏生成,生成時,需要prepare,否則報錯。 
具體見博客。

13.ArrayList和LinkedList的區別

一般大家都知道ArrayList和LinkedList的大致區別: 
1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。 
2.對於隨機訪問get和set,ArrayList覺得優於LinkedList,因爲LinkedList要移動指針。 
3.對於新增和刪除操作add和remove,LinedList比較佔優勢,因爲ArrayList要移動數據。

14.序列化Serializable和Parcelable的理解和區別

15.65k 64k個方法的限制

當Android系統啓動一個應用的時候,有一步是對Dex進行優化,這個過程有一個專門的工具來處理,叫DexOpt。DexOpt的執行過程是在第一次加載Dex文件的時候執行的。這個過程會生成一個ODEX文件,即Optimised Dex。執行ODex的效率會比直接執行Dex文件的效率要高很多。但是在早期的Android系統中,DexOpt有一個問題,也就是這篇文章想要說明並解決的問題。DexOpt會把每一個類的方法id檢索起來,存在一個鏈表結構裏面。但是這個鏈表的長度是用一個short類型來保存的,導致了方法id的數目不能夠超過65536個。當一個項目足夠大的時候,顯然這個方法數的上限是不夠的。儘管在新版本的Android系統中,DexOpt修復了這個問題,但是我們仍然需要對老系統做兼容。 
android studio 中這樣做

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">android{
    defaultConfig {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>
         // Enabling multidex support.
         multiDexEnabled true
    }

    dexOptions {
        javaMaxHeapSize <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"4g"</span> //set the max heap size <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> dexing to 4GB.

        incremental true
    }
}

dependencies {
    //compile fileTree(include: [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'*.jar'</span>], dir: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'libs'</span>)
    //compile project(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">':library'</span>)
    compile <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'com.android.support:multidex:1.0.1'</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li></ul>

16.webview和js的交互,cordova,crosswalkwebview,react native

2.框架知識

利用了什麼框架 
框架是何種原理

2.1afinal

github項目地址

2.2http android Android http請求代碼

HttpClient和HttpURLConnection的區別

okhttp 圖片上傳 斷點續傳

github地址 
android 介紹Retrofit的簡單使用 
Retrofit原理及調用流程分析

xutils

github地址 
Android-xUtils框架原理分析

im

比較好的,就是下面這倆個, 
騰訊im 免費,企業和個人 
網易雲信 個人有期限,企業收費

bug上報實時

bugly 
bghd

二維碼 中興

圖片加載框架

視頻播放

vitamio 
ijkplayer 
vlc

rxjava

ButterKnife基本使用

https://github.com/JakeWharton/butterknife

3.模式知識

3.1觀察者模式

3.2單例模式

4.技術博客

爲知筆記

github項目

Android:學習AIDL,這一篇文章就夠了(上)

MVC以外的另兩種軟件架構(ORM,IOC)

android–動態加載、插件化

mvp 
使用新版Android Studio檢測內存泄露和性能

5.做過的項目,開發環境

移動項目:開發,項目經理 
個人倉庫 
無線電管理監測 
智能玩具交互 
黨建加油站 視頻播放器 
混合開發:rn,cordova

後臺: 
spring hibernate 
node

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