android面試歸來者甲,知識(shí)整理大全

[TOC]
前言:
上個(gè)月抱著想換工作的心態(tài),了解現(xiàn)在互聯(lián)網(wǎng)行業(yè)對(duì)求職者需求砌创,順便了解下自己的水平过牙,參加了幾個(gè)互聯(lián)網(wǎng)公司的面試,幾輪面下來纺铭,有一面就被pass的寇钉,有兩面被pass的,還有最終辛苦走到終面,但由于樓主的犯傻舶赔,最終沒得到一份好offer扫倡。經(jīng)過反思此次面試的經(jīng)歷,發(fā)現(xiàn)自己對(duì)于android的很多基礎(chǔ)知識(shí)竟纳,知其然而不知其所以然撵溃。面試官稍微問深點(diǎn),就不能講解的很清楚锥累,對(duì)于現(xiàn)如今這個(gè)不是會(huì)點(diǎn)移動(dòng)端開發(fā)缘挑,就能輕松找到份不錯(cuò)工作的時(shí)代,很容易被淘汰掉桶略。尤其语淘,對(duì)于一個(gè)工作了有3年,想往高級(jí)開發(fā)者進(jìn)階的程序員來說际歼,更加要好好整理自己平日遇到的問題惶翻。且要不斷的刻意去提深自己,知道自己哪些地方薄弱鹅心,刻意加強(qiáng)吕粗,方可到日后想換工作時(shí)拿到自己滿意的offer。

下面就樓主此次面試的經(jīng)歷旭愧,總結(jié)出來的作為一個(gè)工作了三年的android開發(fā)工程師需要知道的東西颅筋,首先android的基礎(chǔ)知識(shí)必須要知道;其次自己平時(shí)用的第三方庫输枯、android中的一些實(shí)現(xiàn)议泵,需要知道其實(shí)現(xiàn)原理;再次對(duì)于java知識(shí)用押、數(shù)據(jù)結(jié)構(gòu)肢簿、算法等也需要明白靶剑;最后如果能在應(yīng)用性能上蜻拨、架構(gòu)上等某些有一定研究池充,這樣更會(huì)受各家公司面試官的親睞。

Android基礎(chǔ)知識(shí)

一缎讼、組件類

1. Activity相關(guān)

(1) Activity生命周期####

Activity生命周期.jpg
  1. 整個(gè)的生命周期收夸,從onCreate(Bundle)開始到onDestroy()結(jié)束。

  2. 可見的生命周期血崭,從onStart()開始到onStop()結(jié)束卧惜。在這段時(shí)間,可以看到Activity在屏幕上夹纫,盡管有可能不在前臺(tái)咽瓷,不能和用戶交互。在這兩個(gè)接口之間舰讹,需要保持顯示給用戶的UI數(shù)據(jù)和資源等茅姜,例如:可以在onStart中注冊(cè)一個(gè)IntentReceiver來監(jiān)聽數(shù)據(jù)變化導(dǎo)致UI的變動(dòng),當(dāng)不再需要顯示時(shí)候月匣,可以在onStop()中注銷它钻洒。

  3. 前臺(tái)的生命周期,從onResume()開始到onPause()結(jié)束锄开。在這段時(shí)間里素标,該Activity處于所有 Activity的最前面,和用戶進(jìn)行交互萍悴。Activity可以經(jīng)常性地在resumed和paused狀態(tài)之間切換头遭。

  4. 從界面A跳轉(zhuǎn)到界面B,生命周期變化情況:
    當(dāng)用戶點(diǎn)擊A中按鈕來到B時(shí)癣诱,假設(shè)B全部遮擋住了A任岸,將依次執(zhí)行A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop。
    此時(shí)如果點(diǎn)擊Back鍵狡刘,將依次執(zhí)行B:onPause -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy享潜。

  5. 對(duì)于棧最頂上的界面A,按Back鍵和按Home鍵的區(qū)別:
    如果按下Back鍵嗅蔬,系統(tǒng)返回到桌面剑按,并依次執(zhí)行A:onPause -> A:onStop -> A:onDestroy。
    此時(shí)如果按下Home鍵(非長按)澜术,系統(tǒng)返回到桌面艺蝴,并依次執(zhí)行A:onPause -> A:onStop。由此可見鸟废,Back鍵和Home鍵主要區(qū)別在于是否會(huì)執(zhí)行onDestroy猜敢。

(2) Activity的4種啟動(dòng)模式####

1)standard:默認(rèn)的標(biāo)準(zhǔn)啟動(dòng)模式,不管有沒有已存在的實(shí)例,都生成新的實(shí)例缩擂。即使是A startActivity A鼠冕,也會(huì)重新生成一個(gè)新的實(shí)例,再回退時(shí)胯盯,A也會(huì)出現(xiàn)兩次懈费;
2)singleTop:如果發(fā)現(xiàn)有對(duì)應(yīng)的Activity實(shí)例正位于棧頂,則重復(fù)利用博脑,不再生成新的實(shí)例憎乙,如A啟動(dòng)A,不會(huì)生成新的實(shí)例叉趣,會(huì)走A的onNewIntent方法泞边,而不是onCreate方法,回退時(shí)疗杉,也只會(huì)回退一次繁堡;
3)singleTask:所在Activity棧中有對(duì)應(yīng)的Activity實(shí)例,則使此Activity實(shí)例之上的其他Activity實(shí)例統(tǒng)統(tǒng)出棧乡数,使此Activity實(shí)例成為棧頂對(duì)象椭蹄,顯示到幕前,這一般用在程序的主界面上净赴;
4)singleInstance:當(dāng)被啟動(dòng)時(shí)绳矩,系統(tǒng)會(huì)首先判斷系統(tǒng)其他棧中是否已經(jīng)存在此Activity實(shí)例,有則直接使用玖翅,并且其所在的Activity棧理論上只有它一個(gè)Activity元素翼馆。
singleInstance表示該Activity在系統(tǒng)范圍內(nèi)“實(shí)例唯一”。ingInstance和singleTask主要區(qū)別在與系統(tǒng)范圍內(nèi)的“實(shí)例唯一”還是當(dāng)前Activity椊鸲龋“實(shí)例唯一”应媚。

(3) Activity的狀態(tài)保存####

Activity的狀態(tài)保存onSaveInstanceState()、onRestoreInstanceState()
Activity的 onSaveInstanceState() 和onRestoreInstanceState()并不是生命周期方法猜极,當(dāng)應(yīng)用遇到意外情況(如:內(nèi)存不足中姜、用戶直接按Home鍵)由系統(tǒng)銷毀一個(gè)Activity時(shí),onSaveInstanceState()會(huì)被調(diào)用跟伏。但是當(dāng)用戶主動(dòng)去銷毀一個(gè)Activity時(shí)丢胚,例如在應(yīng)用中按返回鍵,onSaveInstanceState()就不會(huì)被調(diào)用受扳。通常onSaveInstanceState()只適合用于保存一些臨時(shí)性的狀態(tài)携龟,而onPause()適合用于數(shù)據(jù)的持久化保存。當(dāng)某個(gè)activity變得“容易”被系統(tǒng)銷毀時(shí)勘高,該activity的onSaveInstanceState就會(huì)被執(zhí)行峡蟋,開發(fā)者可以覆寫onSaveInstanceState()方法坟桅。onSaveInstanceState()方法接受一個(gè)Bundle類型的參數(shù), 開發(fā)者可以將狀態(tài)數(shù)據(jù)存儲(chǔ)到這個(gè)Bundle對(duì)象中, 這樣即使activity被系統(tǒng)摧毀, 當(dāng)用戶重新啟動(dòng)這個(gè)activity而調(diào)用它的onCreate()方法時(shí), 上述的Bundle對(duì)象會(huì)作為實(shí)參傳遞給onCreate()方法, 開發(fā)者可以從Bundle對(duì)象中取出保存的數(shù)據(jù), 然后利用這些數(shù)據(jù)將activity恢復(fù)到被摧毀之前的狀態(tài)。如在橫豎屏切換時(shí)蕊蝗,應(yīng)用的Activity可能要保存edittext中的值仅乓,需要調(diào)用onSaveInstanceState()來何存輸入值。

(4) Activity啟動(dòng)方式####

startActivityForResult兩個(gè)注意事項(xiàng):

  1. 這里需要注意的是匿又,如果被啟動(dòng)的與Activity在AndroidManifest.xml文件中配置的launchMode設(shè)為"singleTask"的時(shí)候,startActivityForResult執(zhí)行后建蹄,onActivityResult立即會(huì)被執(zhí)行到碌更。
    原因:startActivityForResult(Intent,int,Bundle)有說明:if the activity you are launching uses thesingleTask launch mode, it will not run in your task and thus you willimmediately receive a cancel result.因?yàn)锳ctivity1用startActivityForResult啟動(dòng)Activity2, 如果一個(gè)Activity2的啟動(dòng)方式是singleTask時(shí),若Activity2之前在任務(wù)棧中存在洞慎,再次啟動(dòng)它時(shí)痛单,它會(huì)把它上面所有的Activity實(shí)例都pop出棧,這樣再調(diào)setResult時(shí)劲腿,返回的是Activity2任務(wù)棧下面的界面旭绒,而不是Activity1,所以,Activity1收到的一個(gè)cancel的Result焦人。

  2. 另外startActivityForResult的requestCode值必須要大于等于0挥吵,不然,startActivityForResult就變成了 startactivity花椭。

(5) Activity的isFinish/finish()和destroy的區(qū)別####

activity的finish()方法有兩個(gè)層面含義忽匈,1.將此Activity從Activity棧中移除,2.調(diào)用了此Activity的onDestroy方法矿辽。

  1. finish()方法用于結(jié)束一個(gè)Activity的生命周期,但是并沒有釋放他的資源丹允。
  2. onDestory()方法則是Activity的一個(gè)生命周期方法,其作用是在一個(gè)Activity對(duì)象被銷毀之前袋倔,Android系統(tǒng)會(huì)調(diào)用該方法雕蔽,用于釋放此Activity之前所占用的資源。
    有可能程序在運(yùn)行了finish()方法而沒有運(yùn)行onDestory()方法宾娜,因?yàn)锳ctivity生命周期里的方法批狐,不確定什么時(shí)候會(huì)被調(diào)用,皆是由系統(tǒng)確定前塔;
  3. isFinishing方法來判斷Activity是否處于銷毀狀態(tài)贾陷。

(6) Activity和Fragment的區(qū)別####

一個(gè)fragment必須總是嵌入在一個(gè)activity中,同時(shí)fragment的生命周期受activity而影響嘱根,一個(gè)Activity可以運(yùn)行多個(gè) Fragment髓废,一個(gè)fragment也可以在多個(gè)activity中作為一個(gè)模塊,fragment有自己的生命周期该抒,接收自己的輸入事件慌洪,可以從運(yùn)行中的activity添加或移除顶燕。
Activity 的后退棧由系統(tǒng)管理,而 Fragment 的后退棧由所在的Activity 管理冈爹。

2. Broadcast廣播相關(guān)

(1) Broadcast的生命周期####

廣播接收器僅在它執(zhí)行這個(gè)方法時(shí)處于活躍狀態(tài)涌攻。當(dāng) onReceive() 返回后,它即為失活狀態(tài)频伤。

(2) Broadcast的兩種注冊(cè)方式####

  1. 靜態(tài)注冊(cè)恳谎,在AndroidManifest.xml中用<receiver>標(biāo)簽聲明注冊(cè),并在標(biāo)簽內(nèi)用<intent- filter>標(biāo)簽設(shè)置過濾器憋肖。

  2. 動(dòng)態(tài)注冊(cè):動(dòng)態(tài)地在代碼中先定義并設(shè)置好一個(gè) IntentFilter對(duì)象因痛,然后在需要注冊(cè)的地方調(diào) Context.registerReceiver()方法,如果取消時(shí)就調(diào)用Context.unregisterReceiver()方法岸更。如果用動(dòng) 態(tài)方式注冊(cè)的BroadcastReceiver的Context對(duì)象被銷毀時(shí)鸵膏,BroadcastReceiver也就自動(dòng)取消注冊(cè)了。
    注意事項(xiàng):若在使用sendBroadcast()的方法是指定了接收權(quán)限怎炊,則只有在AndroidManifest.xml中用<uses- permission>標(biāo)簽聲明了擁有此權(quán)限的BroascastReceiver才會(huì)有可能接收到發(fā)送來的Broadcast谭企。

3. Content Provider廣播相關(guān)

4. Service服務(wù)相關(guān)

(1) 定義:一個(gè)專門在后臺(tái)處理時(shí)間任務(wù),沒有UI界面评肆;
(2) Service的生命周期

Service生命周期.jpg
① 通過bindService啟動(dòng)的Service生命周期:onCreate()->onBind()->onUnbind()->onDestory()
② 通過startService啟動(dòng)的Service生命周期:onCreate()->onStartCommand()->onDestory()
(3) Service兩種啟動(dòng)方式和區(qū)別:bindService, startService
① startService只是啟動(dòng)Service债查,與啟動(dòng)的組件沒有關(guān)聯(lián),當(dāng)Service調(diào)用stopSelf或是相關(guān)組件調(diào)用stopService服務(wù)才會(huì)終止瓜挽;
② bindService攀操,和組件綁定,其他組件可通過回調(diào)獲取Service代理來和Service交互秸抚,當(dāng)啟動(dòng)方銷毀速和,Service也會(huì)調(diào)用unBinder進(jìn)行解綁,只有所有綁定該Service的組件都解綁了剥汤,Service才會(huì)銷毀颠放。
(4) Service和Activity怎么進(jìn)行通信
(5) Service與IntentService
① Service與它所在應(yīng)用位于同一個(gè)進(jìn)程中; Service還是在主線程中跑吭敢,所以不應(yīng)該在Service中直接處理耗時(shí)的任務(wù)碰凶;
② IntentService:IntentService是Service的子類,比普通的Service增加了額外的功能鹿驼。
它會(huì)創(chuàng)建獨(dú)立的worker線程來處理所有的Intent請(qǐng)求欲低;
會(huì)創(chuàng)建獨(dú)立的worker線程來處理onHandleIntent()方法實(shí)現(xiàn)的代碼,無需處理多線程問題畜晰;
所有請(qǐng)求處理完成后砾莱,IntentService會(huì)自動(dòng)停止,無需調(diào)用stopSelf()方法停止Service凄鼻;
為Service的onBind()提供默認(rèn)實(shí)現(xiàn)腊瑟,返回null,故適合用startService來啟動(dòng)
為Service的onStartCommand提供默認(rèn)實(shí)現(xiàn)聚假,將請(qǐng)求Intent添加到隊(duì)列中;

5. Fragment相關(guān)

(1)Fragment的生命周期

fragment生命周期.png

(2)Fragment之間數(shù)據(jù)傳遞方式

(3)Fragment與Activity之間數(shù)據(jù)傳遞方式

6. SharedPreferences相關(guān)

二闰非、進(jìn)程膘格、線程相關(guān)

1. 多進(jìn)程通信方式

(1)Intent通過bundle發(fā)送數(shù)據(jù)
(2)文件共享
(3)content Provider
(4)AIDL
(5)Messager
(6)Socket

2. 線程間如何進(jìn)行通信

3. 線程間同步有哪幾種

(1)由synchronized關(guān)鍵字修飾方法、代碼塊财松,如果synchronized修飾的是靜態(tài)方法瘪贱,此時(shí)若調(diào)用該靜態(tài)方法,將會(huì)鎖住整修類辆毡。
使用方法菜秦,如餓漢式的線程安全寫法(修飾方法):
//公有的同步靜態(tài)方法
public static synchronized Singleton getInstance() { //鎖住獲取實(shí)例方法
if (instance == null) {
instance = new Singleton();
}
return instance;
}

(2)用特殊域變量(volatile)實(shí)現(xiàn)線程同步
volatile修飾的變量每次都是從內(nèi)存中讀取,而不是從緩存中讀取胚迫,保證每個(gè)線程訪問到的變量值都是一樣的喷户;適應(yīng)用于需要讀同步的線程同步中唾那,常結(jié)合synchronized一起使用访锻。
如單例的雙重鎖寫法
public class Singleton {
private volatile static Singleton singleton; //使用volatile 關(guān)鍵字
private Singleton (){} //私有構(gòu)造函數(shù)
public static Singleton getInstance() {
if (singleton == null) { //第一層校驗(yàn)
synchronized (Singleton.class) {
if (singleton == null) { //第二層校驗(yàn)
singleton = new Singleton();
}
}
}
return singleton;
}
}
這里需要使用volatile來修飾單例的實(shí)例,因?yàn)樵趫?zhí)行singleton = new Singleton();這句里需要三步:

  1. 給Singleton的實(shí)例分配內(nèi)存闹获;
  2. 調(diào)用Singleton()的構(gòu)造函數(shù)期犬,需要初始化成員字段;
  3. 將singleton對(duì)象指向分配的內(nèi)存空間(即singleton不為空了)避诽;
    由于步驟2和步驟3的運(yùn)行順序是不確定的龟虎,如果某線程創(chuàng)建實(shí)例步驟是:1-3-2,在執(zhí)行3還沒有執(zhí)行2時(shí),另外一個(gè)線程就來使用該實(shí)例沙庐,由于執(zhí)行了3就直接把實(shí)例拿走了鲤妥,這樣在使用過程中就會(huì)因?yàn)閟ingleton中某些成員沒有初始化而報(bào)錯(cuò)。
    具體的單例寫法可參考:Android設(shè)計(jì)模式之單例模式的七種寫法

(3)使用重入鎖ReentrantLock類實(shí)現(xiàn)線程同步
用法:先聲明一個(gè) ReentrantLock實(shí)例
Lock lock = new ReentrantLock();
在需要同步的代碼塊前后添加上lock.lock()拱雏;和lock.unlock()棉安;
(4)使用ThreadLocal管理變量

  1. 用ThreadLocal修飾的變量有什么不同?
    使用ThreadLocal創(chuàng)建的變量叫線程局部變量铸抑,只可以被當(dāng)前線程訪問并修改贡耽,其他線程無法訪問或修改。若使用ThreadLocal來管理變量鹊汛,每個(gè)線程使用的都是該變量的副本蒲赂,副本之間是相互獨(dú)立的,這樣每個(gè)線程都可以隨意修改自己變量的副本刁憋,而不會(huì)對(duì)其他線程產(chǎn)生影響滥嘴。

  2. ThreadLocal內(nèi)部實(shí)現(xiàn)原理,怎么保證數(shù)據(jù)僅被當(dāng)前線程持有至耻?
    ThreadLocal在進(jìn)行放值時(shí)的代碼如下:
    public void set(T value) {
    Thread currentThread = Thread.currentThread();//獲取當(dāng)前線程
    Values values = values(currentThread);//利用當(dāng)前線程作為句柄獲取一個(gè)Values對(duì)象
    if (values == null) {
    values = initializeValues(currentThread);//values為空則創(chuàng)建一個(gè)values對(duì)象
    }
    values.put(this, value);//將值放入values對(duì)象中
    }
    ThreadLocal的值是放入了當(dāng)前線程的一個(gè)Values實(shí)例中氏涩,所以只能在本線程訪問届囚,其他線程無法訪問。

  3. ThreadLocal修飾的變量一定不能被其他線程訪問么是尖?
    答案是不是:對(duì)于子線程是可以訪問父線程中的threadlocal修飾的變量的意系。
    如果在主線程中創(chuàng)建一個(gè)InheritableThreadLocal實(shí)例,那么在子線程中就可以得到InheritableThreadLocal實(shí)例,并獲取相應(yīng)的值乒裆。
    在ThreadLocal中# inheritValues(Values fromParent) 方法來獲取父線程中的值章蚣。

4)ThreadLocal的對(duì)象存放在哪?
答案是堆上:在Java中迎瞧,第個(gè)線程都會(huì)有一個(gè)棧內(nèi)存,棧內(nèi)存屬于單個(gè)線程逸吵,其存儲(chǔ)的變量只能在其所屬線程中可見凶硅。但是TheadLocal的值是被線程實(shí)例所有,而線程實(shí)例是由其創(chuàng)建的類所持有扫皱,所以ThreadLocal實(shí)例實(shí)際上也是被其創(chuàng)建的類所持有足绅,故它們都存在于堆上。

5)ThreadLocal會(huì)導(dǎo)致內(nèi)存泄漏么韩脑?
答案是不會(huì):雖然ThreadLocal實(shí)例被線程中的Values實(shí)例所持有氢妈,也可以被看成是線程所持有,若使用線程池段多,之前的線程實(shí)例處理完后出于復(fù)用的目的依然存在首量,但Values在選擇key時(shí),并不是直接選擇ThreadLocal實(shí)例进苍,而是ThreadLocal實(shí)例的弱引用:
Reference<ThreadLocal<?>> reference = (Reference<ThreadLocal<?>>) k;
ThreadLocal<?> key = reference.get();
在get方法中也是采用弱引用:
private final Reference<ThreadLocal<T>> reference
= new WeakReference<ThreadLocal<T>>(this);
if (this.reference == table[index]) {
return (T) table[index + 1];
}
這樣能保證如查當(dāng)前thread被銷毀時(shí)加缘,ThreadLocal也會(huì)隨著銷毀被GC回收。

6)在android中的應(yīng)用
android中的looper類就是利用了ThreadLocal特性觉啊,保證每個(gè)線程只存在一個(gè)looper對(duì)象拣宏。
static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
private static void prepare(boolean quitAllowed) {
if (sThreadLocal.get() != null) {
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper(quitAllowed));
}

  1. 應(yīng)用場(chǎng)景:
    在實(shí)現(xiàn)單個(gè)線程上下文信息存儲(chǔ),比如交易id等柄延,

4. AIDL實(shí)現(xiàn)原理

5. Binder機(jī)制

6. Handler實(shí)現(xiàn)機(jī)制

7. Rxjava中的線程切換機(jī)制原理

8. AsyncTask原理

AsyncTask是對(duì)Thread和Handler的組合包裝,一些使用規(guī)擇:
類的定義蚀浆、實(shí)例化、調(diào)用execute必須在主線程中調(diào)用搜吧,一個(gè)task只能執(zhí)行一次市俊;定義了一個(gè)線程池THREAD_POOL_EXECUTOR

5?,它實(shí)現(xiàn)的原理是什么滤奈?

6? 集合類中哪些是線程安全摆昧、哪些不是線程安全的,還可引申出蜒程,不同集合類的區(qū)別绅你,Arraymap和HashMap的區(qū)別等

7?

三伺帘、內(nèi)存相關(guān)

1. 圖片類

(1) 如何加載大圖,如幾百M(fèi)甚至1G的大圖如何加載忌锯?
①在內(nèi)存中壓縮圖片伪嫁,如通過設(shè)置壓縮比options.inSampleSize,再進(jìn)行讀圖
②除低要顯示的圖片色彩質(zhì)量
如:alpah_8:每個(gè)像素占1byte的內(nèi)存
RGB_565:每個(gè)像素占2byte的內(nèi)存
ARBG_444:每個(gè)像素占2byte的內(nèi)存(漸變色效果圖片偶垮,會(huì)使?jié)u變色呈現(xiàn)色彩條狀)
ARGB_888:每個(gè)像素占4byte的內(nèi)存(默認(rèn)顯示方式)
如果對(duì)圖片要求不高张咳,可以RGB_565或是ARBG_444格式顯示圖片
③若只查詢圖片信息,可通過設(shè)置options.inJustDecodeBounds=true;設(shè)置不把圖片加載到內(nèi)存中似舵,但可以獲取到圖片的寬脚猾、高和大小等參數(shù)
(2) 100*100像素圖片,需要占用手機(jī)多少內(nèi)存砚哗?

屏幕快照 2017-03-05 下午3.55.50.png

參考資料:[ 一張圖片占多大內(nèi)存的計(jì)算-android]http://blog.csdn.net/shareus/article/details/50947185

2. 一般一個(gè)應(yīng)用手機(jī)會(huì)分配多少內(nèi)存

3. 內(nèi)存溢出龙助,哪些情況下會(huì)導(dǎo)致內(nèi)存溢出,如何避免

4. 內(nèi)存泄漏蛛芥,一些常見的可能導(dǎo)致內(nèi)存泄漏的場(chǎng)景提鸟,如何避免

5. 內(nèi)存泄漏的檢測(cè)

6. 內(nèi)存優(yōu)化

四、性能優(yōu)化

1. ListView可以采取哪些提升性能

(1)采用convertview進(jìn)行布局復(fù)用常空,通過setTag, getTag沽一,獲取布局
(2)運(yùn)用ViewHolder盖溺,避免重復(fù)調(diào)用findViewById
(3)item的布局層級(jí)越少越好
(4)滑動(dòng)時(shí)不加載一些耗資源如圖片等漓糙,停止時(shí)再加載,使用異步加載
(5)在adapter中的getView方法中盡量少使用邏輯
(6)將ListView的scrollingCache和animateCache設(shè)置為false
(7)在listview滑動(dòng)時(shí)烘嘱,判斷不進(jìn)行圖片等的加載
參考資料:[提高ListView性能的技巧]http://www.androidchina.net/3189.html

五昆禽、控件類

1. RecyclerView和ListView的區(qū)別

2. 自定義view的步驟

(1)確定是完全自定義還是繼承View的派生子類
(2) 定義自定義屬性,在資源元素<declare-styleable>中為您的view定義自定義屬性蝇庭。
(3) 獲取自定義屬性醉鳖,當(dāng)view從XML布局中創(chuàng)建了之后,XML標(biāo)簽中所有的屬性都從資源包中讀取出來并作為一個(gè)AttributeSet傳遞給view的構(gòu)造函數(shù)哮内。
(4) 添加屬性和事件
(5) 自定義繪制(實(shí)施),重寫onDraw()\onMesure()方法盗棵,如果是viewGroup,還需要重寫onLayout()方法

3. View和ViewGroup事件分發(fā)機(jī)制###

(1)dispatchTouchEvent
(2)OnInterceptTouchEvent
(3)TouchEvent

4.RecycleView的側(cè)滑刪除實(shí)現(xiàn)

5.圖片縮放的實(shí)現(xiàn)

6.include\ merge\ Stub區(qū)別北发,merge要求

7.ScrollView和ListView事件沖突

8.ScrollView嵌套ListView, 導(dǎo)致ListView顯示不完整纹因,只顯示一行

第三方庫及實(shí)現(xiàn)原理

一、網(wǎng)絡(luò)加載##

1.網(wǎng)絡(luò)請(qǐng)求庫(Volley琳拨、OkHttp瞭恰、Retrofit ,android-async-http 的作者已經(jīng)不維護(hù)不討論)

  1. OkHttp 是 Square 公司開源的針對(duì) Java 和 Android 程序狱庇,封裝的一個(gè)高性能 http 請(qǐng)求庫惊畏,所以它的職責(zé)跟 HttpUrlConnection 是一樣的恶耽,支持 spdy、http 2.0颜启、websocket 偷俭,支持同步、異步缰盏, OkHttp 還封裝了線程池社搅、數(shù)據(jù)轉(zhuǎn)換、參數(shù)使用乳规、錯(cuò)誤處理等形葬,api 使用起來更加方便∧旱模可以把它理解成是一個(gè)封裝之后的類似 HttpUrlConnection 的一個(gè)東西冻辩,但在使用的時(shí)候仍然需要自己再做一層封裝,這樣才能像使用一個(gè)框架一樣更加順手。OkHttp 基于 NIO 和 Okio ,所以性能上要比 Volley更快。

  2. Volley 是 Google 官方出的一套小而巧的異步請(qǐng)求庫娇唯,該框架封裝的擴(kuò)展性很強(qiáng)敢茁,支持 HttpClient谎砾、HttpUrlConnection碉哑,甚至支持 OkHttp贮尖,但不支持 post 大數(shù)據(jù),所以不適合上傳文件。Volley 設(shè)計(jì)的初衷本身也就是為頻繁的、數(shù)據(jù)量小的網(wǎng)絡(luò)請(qǐng)求而生繁涂。

  3. Retrofit 是 Square 公司出品的默認(rèn)基于 OkHttp 封裝的一套 RESTful 網(wǎng)絡(luò)請(qǐng)求框架桶雀,通過注解直接配置請(qǐng)求敞咧,可以使用不同的 http 客戶端评疗,默認(rèn)是用 http 呜投,可以使用不同 Json Converter 來序列化數(shù)據(jù),同時(shí)提供對(duì) RxJava 的支持。

  4. OKHttp的優(yōu)點(diǎn):
    HTTP/2 以及 SPDY的支持多路復(fù)用
    連接池會(huì)降低并發(fā)連接數(shù)
    透明GZIP加密減少下載體積
    響應(yīng)緩存避免大量重復(fù)請(qǐng)求
    同時(shí)支持同步的阻塞式調(diào)用與異步回調(diào)式調(diào)用

2.Retrofit中通過注解方式定義參數(shù)逊笆、地址、請(qǐng)求方式等缩歪,是怎么實(shí)現(xiàn)的###

3.Retrofit中網(wǎng)絡(luò)請(qǐng)求框架實(shí)現(xiàn)原理###

它使用動(dòng)態(tài)代理技術(shù),實(shí)現(xiàn)在接口中聲明的方法谍憔,采用注解方式
參考資料:1)[Android開源項(xiàng)目推薦之「網(wǎng)絡(luò)請(qǐng)求哪家強(qiáng)」]https://zhuanlan.zhihu.com/p/21879931
2)[[Android] Retrofit 2.0實(shí)現(xiàn)原理
(http://blog.qiji.tech/archives/category/android)

4.Http頭部一般包括哪些內(nèi)容###

5.Http協(xié)議相關(guān)###

總體來說匪蝙,http協(xié)議是從http1.0->http1.1->https-> SPDY->http2.0發(fā)展過來的;
(1)HTTP1.1相對(duì)于HTTP1.0的改進(jìn):添加了更多的緩存頭策略习贫;寬帶優(yōu)化逛球;優(yōu)化了錯(cuò)誤通知處理;添加了Host頭部處理苫昌;支持長連接颤绕;
(2)https相對(duì)于http1.x的改進(jìn):
HTTPS協(xié)議需要到CA申請(qǐng)證書;
HTTP協(xié)議運(yùn)行在TCP之上,所有傳輸?shù)膬?nèi)容都是明文奥务,HTTPS運(yùn)行在SSL/TLS之上涕烧,SSL/TLS運(yùn)行在TCP之上,所有傳輸?shù)膬?nèi)容都經(jīng)過加密的汗洒;
HTTP和HTTPS使用的是完全不同的連接方式议纯,用的端口也不一樣,前者是80溢谤,后者是443瞻凤;
HTTPS可以有效的防止運(yùn)營商劫持,解決了防劫持的一個(gè)大問題世杀。
(3)SPDY相對(duì)于https的改進(jìn):
采取了多路復(fù)用(multiplexing)阀参,降低延遲,還可設(shè)置請(qǐng)求的優(yōu)先級(jí)瞻坝;
請(qǐng)求頭部header壓縮蛛壳;服務(wù)端推送(server push);
(4)http2.0相對(duì)于SPDY的改進(jìn):
HTTP2.0的協(xié)議解析采用二進(jìn)制格式所刀,更健壯衙荐;
優(yōu)化http請(qǐng)求頭部壓縮。
參考資料:(HTTP,HTTP2.0,SPDY,HTTPS你應(yīng)該知道的一些事

6.webview和js相互調(diào)用###

二浮创、圖片加載庫##

1.Glide, UniversalImageLoader, Picasso, Fresco區(qū)別###

(1) Glide 默認(rèn)的 Bitmap 格式是 RGB_565 格式忧吟,而 Picasso 默認(rèn)的是 ARGB_8888 格式,這個(gè)內(nèi)存開銷要小一半斩披。
(2) 在磁盤緩存方面溜族,Picasso 只會(huì)緩存原始尺寸的圖片,而 Glide 緩存的是多種規(guī)格垦沉,也就意味著 Glide 會(huì)根據(jù)你 ImageView 的大小來緩存相應(yīng)大小的圖片尺寸煌抒,比如你 ImageView 大小是200 x 200,原圖是 400 x 400 厕倍,而使用 Glide 就會(huì)緩存 200 x 200 規(guī)格的圖寡壮,而 Picasso 只會(huì)緩存 400 x 400 規(guī)格的。這個(gè)改進(jìn)就會(huì)導(dǎo)致 Glide 比 Picasso 加載的速度要快绑青,畢竟少了每次裁剪重新渲染的過程诬像。
(3) Glide 支持加載 Gif 動(dòng)態(tài)圖,而 Picasso 不支持該特性闸婴。
(4) Fresco 將圖片放到一個(gè)特別的內(nèi)存區(qū)域叫 Ashmem 區(qū),就是屬于 Native 堆芍躏,圖片將不再占用 App 的內(nèi)存邪乍。
(5)各網(wǎng)絡(luò)請(qǐng)求庫使用線程池情況:

  1. Picasso在Wifi下線程數(shù)為4,而4G下線程數(shù)為3, 3G下為2, 2G下為1,默認(rèn)狀況為3.
  2. UniversalImageLoader的加載任務(wù)線程池和緩存處理線程池的默認(rèn)大小都為3庇楞,同時(shí)默認(rèn)線程優(yōu)先級(jí)是Thread.NORM_PRIORITY-2,線程池的任務(wù)處理類型都是FIFO榜配。
  3. Glide加載緩存未命中的線程池會(huì)根據(jù)根據(jù)CPU的數(shù)量和Java虛擬機(jī)中可用的處理器數(shù)量來選擇合適的線程數(shù),但是最多不超過4;而加載緩存命中的圖片的線程池默認(rèn)大小為1.
    參考資料:1)[[ Android ] Fresco 與 Picasso 吕晌、Glide 的比較]http://blog.qiji.tech/archives/6344
  4. [Android的App中線程池的使用蛋褥,具體使用多少個(gè)線程池?]https://www.zhihu.com/question/37804956
    3)[Android開源項(xiàng)目推薦之「圖片加載到底哪家強(qiáng)」]https://zhuanlan.zhihu.com/p/21397115

2.Glide是怎么實(shí)現(xiàn)圖片加載的###

一般只需要對(duì)一種圖片加載庫進(jìn)行研究即可睛驳,如以Glide為例烙心,圖片加載流程圖:


流程圖.png

它主要采用的技術(shù)有:

  1. 圖片池:(BitmapPool,實(shí)現(xiàn)類是LruBitmapPool乏沸,是一個(gè)基于LRU方式的Bitmap緩存池淫茵,用于Bitmap的復(fù)用)
  2. 兩級(jí)內(nèi)存緩存:LruResourceCache, activeResources(先從LruResourceCache中尋找資源蹬跃,若找到則將其從cache中移除并放入activeResources中匙瘪,否則從activeResources中尋找。比一般內(nèi)存緩存額外多一級(jí)緩存的意義在于蝶缀,當(dāng)內(nèi)存不足時(shí)清理cache中的資源時(shí)丹喻,不會(huì)對(duì)使用中的Bitmap造成影響)。
  3. 磁盤緩存(若內(nèi)存中沒有翁都,則從磁盤中查找驻啤,根據(jù)不同的磁盤緩存策略,源數(shù)據(jù)可首先被寫入到磁盤荐吵,對(duì)獲取的Bitmap將其轉(zhuǎn)換然后從緩存文件中加載骑冗,而不是直接返回)
    4)網(wǎng)絡(luò)獲取(利用線程池策略先煎,采用okHttp進(jìn)行請(qǐng)求贼涩,并將文件流寫入磁盤緩存,再對(duì)文件流進(jìn)行編碼)
    參考資料:1) [Glide源碼分析]http://www.reibang.com/p/96fc561eada1

3.MultiDex是怎么實(shí)現(xiàn)分包的薯蝎,它的實(shí)現(xiàn)原理遥倦,多個(gè)dex是怎么加載的###

參考資料:1)[Android MultiDex實(shí)現(xiàn)原理解析]http://www.reibang.com/p/79a14d340cb0

Java基礎(chǔ)知識(shí)、數(shù)據(jù)結(jié)構(gòu)占锯、算法袒哥、設(shè)計(jì)模式

一、 算法##

1. 排序算法###

快速排序消略、歸并排序堡称、兩個(gè)有序數(shù)組合并

2. 棧和隊(duì)列###

(1)用兩個(gè)隊(duì)列實(shí)現(xiàn)一個(gè)棧,用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列
(2)寫一個(gè)棧的實(shí)現(xiàn)代碼(用數(shù)組實(shí)現(xiàn))

3. 判斷一個(gè)點(diǎn)在一個(gè)三角形內(nèi)###

4. 七種單例寫法及優(yōu)缺點(diǎn)###

5. 設(shè)計(jì)模式###

(1) 單例模式(餓漢式艺演、懶漢式却紧、如何保證線程安全桐臊、雙重鎖機(jī)制)
(2) 觀察者模式(Rxjava中的Observer和Observable、List中的adapter#notifyDataSetChanged())
(3) Builder模式(一般的鏈?zhǔn)秸{(diào)用晓殊,如Glide.with)

參考資料: 從Android代碼中來記憶23種設(shè)計(jì)模式

架構(gòu)断凶、性能等知識(shí)專項(xiàng)研究

1.apk 瘦包機(jī)制##

屏幕快照 2017-03-03 上午8.26.00.png

上圖是一般的apk包包含的文件,如果加入混淆等還會(huì)有proguard.cfg巫俺、project.properties等文件认烁,從圖中可以看出AndroidManifest.xml、META-INF這些本身就很小沒有必要做進(jìn)一步壓縮的文件介汹,而其它文件或者文件夾都可以考慮進(jìn)行優(yōu)化却嗡,從而減小APK的體積。下面具體說說android apk
(1) 使用lint去除一些無用的代碼痴昧、資源減小resources.arsc體積
可以借助Android Studio→Inspect Code...對(duì)工程做靜態(tài)代碼檢查稽穆,刪掉無用的代碼;
(2) 代碼混淆減少classes.dex大小
代碼混淆可以減小該文件的大小赶撰,因?yàn)榛煜蟮拇a將較長的文件名舌镶、實(shí)例、變量豪娜、方法名等等做了簡(jiǎn)化餐胀,從而實(shí)現(xiàn)字節(jié)長度上的優(yōu)化;
(3)壓縮資源:

  1. 使用一些小圖片代替大圖瘤载,有些適配圖片可能只需要保留一套如xxhdpi否灾,有些背景圖片用代碼實(shí)現(xiàn),用.9.png鸣奔;
  2. 使用tinypng壓縮圖片墨技;
  3. 對(duì)圖片質(zhì)量要求不是很嚴(yán)格,可以考慮不帶alpha值的jpg圖片挎狸、同等質(zhì)量下文件更小的webP圖片格式扣汪;
  4. 借助微信提供的AndResGuard資源文件混淆工具對(duì)資源文件做混淆,進(jìn)一步壓縮資源文件所占用的空間锨匆;
    (4) 去掉一些不用的適配
  5. 如果只需要支持中文崭别,可在build.grade中添加resConfigs "zh"去除無用的語言資源;
  6. 去掉一些so包支持
    一種CPU架構(gòu) = 一種ABI = 一種對(duì)應(yīng)的SO庫恐锣;
    現(xiàn)在手機(jī)市場(chǎng)總共支持以下七種不同的CPU架構(gòu):ARMv5茅主,ARMv7,x86土榴,MIPS诀姚,ARMv8,MIPS64和x86_64, 這7種CPU類型對(duì)應(yīng)的SO庫的文件夾名是:armeabi鞭衩,armeabi-v7a学搜,x86娃善,mips论衍,arm64-v8a瑞佩,mips64,x86_64坯台。所有的x86/x86_64/armeabi-v7a/arm64-v8a設(shè)備都支持armeabi架構(gòu)的.so文件炬丸,64位設(shè)備(arm64-v8a, x86_64, mips64)能夠運(yùn)行32位的函數(shù)庫,所以應(yīng)用不需要支持很多設(shè)備蜒蕾,建議實(shí)際工作的配置是只保留armable稠炬、armable-x86下的so文件,當(dāng)然so包是向下兼容的咪啡,如果提供了其他cpu類型的文件夾首启,也需要在相應(yīng)的文件夾里補(bǔ)全所有的so包,要不手機(jī)到時(shí)適配找不到合適的so包導(dǎo)致crash撤摸。
    (5) 減小或甚用第三方依賴庫
    如果只使用第三方依賴庫的少部分功能毅桃,可以考慮只提取少部分代碼,而不是直接把第三庫全部引入准夷;
    用較少的庫替換大庫钥飞;
    (6) 插件化和動(dòng)態(tài)加載
    上面提到的so包,可以只提供一套衫嵌,在應(yīng)用運(yùn)行時(shí)读宙,需要用到so包的地方,可以從服務(wù)器下載so包楔绞,再動(dòng)態(tài)加載结闸;

參考資料:

  1. 如何做到將apk大小減少6M
    2)[Android動(dòng)態(tài)加載]http://www.reibang.com/p/e9da13f647a9

2.Android配配##

(1) 多語言適配
不同國家語方適配、相同語言不同國家
(2) 多系統(tǒng)版本適配
(3) 不同屏幕分辨率適配
除了h酒朵、xh桦锄、xxh多圖,還包括一些特殊屏幕分辨率的適配
(4)不同手機(jī)版本適配

3.架構(gòu)##

MVC 耻讽、MVP察纯、 MVVM框架的區(qū)別,實(shí)現(xiàn)

4.Android打包##

Ant打包和Gradle打包流程针肥、步驟饼记、區(qū)別
JNI、NDK相關(guān)

5.Android測(cè)試##

面試雜談

1? 遇到什么技術(shù)難題慰枕,你是如何解決的具则?
一般的人都會(huì)遇到一些技術(shù)難題,需要平時(shí)進(jìn)行總結(jié)歸納具帮,并最好能寫成博客的習(xí)慣博肋,這樣更有說服力低斋;

2? 平常一般看些什么書,或是平時(shí)都瀏覽哪些網(wǎng)站匪凡?
這個(gè)不要隨意發(fā)揮膊畴,樓主當(dāng)時(shí)在終面時(shí)就被問到過,結(jié)果樓主傻傻的回答病游,自己平時(shí)會(huì)看些文學(xué)書唇跨,現(xiàn)在回想起來,作為一個(gè)技術(shù)人員衬衬,老板當(dāng)然希望你是一個(gè)鉆研技術(shù)的好員工买猖,至少你應(yīng)該答自己平時(shí)看些架構(gòu)方面、性能優(yōu)化滋尉、或是一些該領(lǐng)域牛人出的書玉控。最好有自己的讀后感,應(yīng)用到實(shí)際開發(fā)中狮惜,也可以寫成博客的形式高诺。
對(duì)于平時(shí)瀏覽的網(wǎng)站,也最好答一些跟技術(shù)相關(guān)的讽挟,如csdn懒叛、簡(jiǎn)書、github耽梅、stackOverFlow薛窥、或是關(guān)注的一些牛人、團(tuán)隊(duì)眼姐、微信公眾號(hào)等诅迷,而不是說自己平時(shí)沒事刷微博、朋友圈众旗、逛淘寶之類的罢杉,老板招的是需要干活的員工,而不是拿著公司錢贡歧,讓你娛樂滩租。

3? 自己記憶比深刻的文章?
如果你回答沒有什么記憶深刻的文章利朵,說明你自己平時(shí)看文章都是蜻蜓點(diǎn)水律想,淺嘗輒止,沒有深入去研究绍弟,網(wǎng)上有那么多好文章技即,你都沒有一篇記憶深刻的么?這就需要咱們平時(shí)看別人的文章時(shí)樟遣,深入思考而叼,發(fā)現(xiàn)文章中有哪些寫的好地方身笤,哪些寫的不好的,如果是自己來寫會(huì)怎么寫葵陵,文章有哪些改進(jìn)之處等液荸。一般文章下面還會(huì)有留言區(qū),讀者還可以和作者進(jìn)行互動(dòng)等埃难。

4? 平時(shí)空閑時(shí)間都做些什么莹弊?
這個(gè)也不要隨意發(fā)揮涤久,當(dāng)時(shí)樓主也很犯二的回答涡尘,做飯、鍛煉身體和一些其他跟工作八桿子打不著的回答响迂。事后想想對(duì)于一個(gè)平時(shí)都不肯花時(shí)間去提升自己的員工考抄,每日只靠工作的那點(diǎn)時(shí)間,不去刻意提升自己蔗彤,這樣的人對(duì)技術(shù)沒有什么追求川梅。所以回答時(shí),最好說自己平時(shí)會(huì)關(guān)注當(dāng)前行業(yè)的一些動(dòng)態(tài)然遏,一些大牛寫的博客贫途,看看相關(guān)專業(yè)的書,寫寫博客待侵,總結(jié)總結(jié)之類的丢早。

文章還在整理中,有些還只有標(biāo)題秧倾,沒有內(nèi)容怨酝,同時(shí)有些可能寫的不對(duì)的地方,希望大家提出那先,一起進(jìn)步农猬,謝謝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末售淡,一起剝皮案震驚了整個(gè)濱河市斤葱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌揖闸,老刑警劉巖揍堕,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異楔壤,居然都是意外死亡鹤啡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門蹲嚣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來递瑰,“玉大人祟牲,你說我怎么就攤上這事《恫浚” “怎么了说贝?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長慎颗。 經(jīng)常有香客問我乡恕,道長,這世上最難降的妖魔是什么俯萎? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任傲宜,我火速辦了婚禮,結(jié)果婚禮上夫啊,老公的妹妹穿的比我還像新娘函卒。我一直安慰自己,他們只是感情好撇眯,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布报嵌。 她就那樣靜靜地躺著,像睡著了一般熊榛。 火紅的嫁衣襯著肌膚如雪锚国。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天玄坦,我揣著相機(jī)與錄音血筑,去河邊找鬼。 笑死营搅,一個(gè)胖子當(dāng)著我的面吹牛云挟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播转质,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼园欣,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了休蟹?” 一聲冷哼從身側(cè)響起沸枯,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赂弓,沒想到半個(gè)月后绑榴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盈魁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年翔怎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赤套,死狀恐怖飘痛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情容握,我是刑警寧澤宣脉,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站剔氏,受9級(jí)特大地震影響塑猖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谈跛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一羊苟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧币旧,春花似錦践险、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽彭则。三九已至鳍刷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間俯抖,已是汗流浹背输瓜。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芬萍,地道東北人尤揣。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像柬祠,于是被迫代替她去往敵國和親北戏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,296評(píng)論 25 707
  • 從三月份找實(shí)習(xí)到現(xiàn)在漫蛔,面了一些公司嗜愈,掛了不少,但最終還是拿到小米莽龟、百度蠕嫁、阿里、京東毯盈、新浪剃毒、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,277評(píng)論 11 349
  • 哎呀呀 ,馬上就要面臨找工作了,媛媛心里緊張呀. 作為一個(gè)即將畢業(yè)的Android程序媛,開始面臨找工作了,...
    左神話閱讀 4,569評(píng)論 7 59
  • #先說明下我不是米粉,為什么選擇小米智能插座而不是公牛赘阀、 BroadLink陪拘、控客、ORVIBO這幾家(或者其他的...
    粵B無數(shù)閱讀 42,863評(píng)論 0 0
  • 大家都聽說過“盲人摸象”的故事纤壁,就是幾個(gè)盲人左刽,根據(jù)各自的經(jīng)驗(yàn),對(duì)大象進(jìn)行的抽象的描述酌媒。茶山就借用這個(gè)故事欠痴,來簡(jiǎn)單的...
    茶山閱讀 769評(píng)論 0 2