一面:
算法:
1、n!
public static int recursive(int n){
if(n<=1){
return 1;
}else{
return n*recursive(n-1);
}
}
2、實(shí)現(xiàn) double base 的 int expand 次冪
public class Solution {
public double Power(double base, int exponent) {
double mul=1.0;
/* 如果exponent = 0 輸出1 */
if(exponent == 0)
{
return 1.00000;
}
/* 如果base = 0 輸出0 */
if(base >= -0.000001 && base <= 0.000001)
{
return 0;
}
/* 如果指數(shù)大于0 */
if(exponent > 0)
{
for(int index = 0; index < exponent; index++)
{
mul *= base;
}
}
else
{
exponent = -exponent;
for(int index = 0; index < exponent; index++)
{
mul *= base;
}
mul = 1.0/mul;
}
return mul;
}
}
retrofit原理:
反觀一下Retrofit,其內(nèi)部的設(shè)計(jì)結(jié)構(gòu)非常清晰,
通過(guò)動(dòng)態(tài)代理來(lái)處理接口,
通過(guò)OkHttp來(lái)處理網(wǎng)絡(luò)請(qǐng)求,
通過(guò)CallAdapterFactory來(lái)適配OkHttpCall,
通過(guò)ConverterFactory來(lái)處理數(shù)據(jù)格式的轉(zhuǎn)換,
這符合面對(duì)對(duì)象設(shè)計(jì)思想的,同時(shí),Retrofit對(duì)CallAdpaterFactory和ConverterFactory的依賴(lài)都是依賴(lài)其接口的,這就讓我們可以非常方便的擴(kuò)展自己的CallAdpaterFactory和ConverterFactory,這符合
;不管Retrofit內(nèi)部的實(shí)現(xiàn)如何復(fù)雜,比如動(dòng)態(tài)代理的實(shí)現(xiàn)、針對(duì)注解的處理以及尋找合適的適配器等,Retrofit對(duì)開(kāi)發(fā)者隱藏了這些實(shí)現(xiàn)細(xì)節(jié),只提供了簡(jiǎn)單的Api給開(kāi)發(fā)者調(diào)用,開(kāi)發(fā)者只需要關(guān)注通過(guò)的Api即可實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求,這種對(duì)外隱藏具體的實(shí)現(xiàn)細(xì)節(jié)的思想符合
。另外,Retrofit內(nèi)部大量使用了設(shè)計(jì)模式,比如構(gòu)造Retrofit對(duì)象時(shí)使用了
,處理接口時(shí)是用來(lái)
,適配OkHttpCall時(shí)使用了
,生成CallAdpater和Converter時(shí)使用了
。Retrofit的設(shè)計(jì)正是因?yàn)樽裱嗣嫦驅(qū)ο蟮乃枷?,以及?duì)設(shè)計(jì)模式的正確應(yīng)用,才使得其具備結(jié)構(gòu)清晰、易于擴(kuò)展的特點(diǎn)。
怎樣保證兩個(gè)線(xiàn)程不死鎖
執(zhí)行順序,避免循環(huán)等待,設(shè)置鎖的超時(shí)時(shí)間
1、activity生命周期 a啟動(dòng)b,2、如果b是透明的
a的onpause——onstop——b的oncreate——onstart——onresume
anr異常產(chǎn)生,分析
當(dāng)主線(xiàn)程在 Sleep 的時(shí)候,如果 UI線(xiàn)程不需要進(jìn)行操作,也就是說(shuō)沒(méi)有消息會(huì)發(fā)送給UI線(xiàn)程并要求UI線(xiàn)程進(jìn)行處理的時(shí)候 Sleep 30秒就不會(huì)導(dǎo)致ANR,因?yàn)闆](méi)有 出現(xiàn) ANR(應(yīng)用沒(méi)有響應(yīng))的情況啊,沒(méi)有人向線(xiàn)程請(qǐng)求什么東西,也就不需要響應(yīng)了,既然沒(méi)有響應(yīng)了,那怎么會(huì)有ANR呢?
Android N 的 ANR時(shí)間
- Service 超時(shí)
// How long we wait for a service to finish executing.
static final int SERVICE_TIMEOUT = 20*1000; // 前臺(tái)
// How long we wait for a service to finish executing.
static final int SERVICE_BACKGROUND_TIMEOUT = SERVICE_TIMEOUT * 10; // 后臺(tái)
- Broadcast 超時(shí)
// How long we allow a receiver to run before giving up on it.
static final int BROADCAST_FG_TIMEOUT = 10*1000; // 前臺(tái)
static final int BROADCAST_BG_TIMEOUT = 60*1000; // 后臺(tái)
- InputDispatching 超時(shí)
// How long we wait until we timeout on key dispatching.
static final int KEY_DISPATCHING_TIMEOUT = 5*1000;
- ContentProvider 超時(shí)
// How long we wait for an attached process to publish its content providers
// before we decide it must be hung.
static final int CONTENT_PROVIDER_PUBLISH_TIMEOUT = 10*1000;
繪制卡頓分析,解決
自行補(bǔ)充
除了jni,鏈接java和c的通信方式
除了aidl 還有hidl
使用過(guò)的設(shè)計(jì)模式:?jiǎn)卫?,工廠(chǎng)方法,建造者
單例也會(huì)產(chǎn)生內(nèi)存泄露,為什么

不管外面?zhèn)魅胧裁碈ontext,最終都會(huì)使用Applicaton的Context,而我們單例的生命周期和應(yīng)用的一樣長(zhǎng),這樣就防止了內(nèi)存泄漏。
okhttp的責(zé)任鏈模式有哪些
自行補(bǔ)充
git和svn的優(yōu)缺點(diǎn)
1.SVN優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1、 管理方便,邏輯明確,符合一般人思維習(xí)慣。
2、 易于管理,集中式服務(wù)器更能保證安全性。
3、 代碼一致性非常高。
4、 適合開(kāi)發(fā)人數(shù)不多的項(xiàng)目開(kāi)發(fā)。
缺點(diǎn):
1、 服務(wù)器壓力太大,數(shù)據(jù)庫(kù)容量暴增。
2、 如果不能連接到服務(wù)器上,基本上不可以工作,看上面第二步,如果服務(wù)器不能連接上,就不能提交,還原,對(duì)比等等。
3、 不適合開(kāi)源開(kāi)發(fā)(開(kāi)發(fā)人數(shù)非常非常多,但是Google app engine就是用svn的)。但是一般集中式管理的有非常明確的權(quán)限管理機(jī)制(例如分支訪(fǎng)問(wèn)限制),可以實(shí)現(xiàn)分層管理,從而很好的解決開(kāi)發(fā)人數(shù)眾多的問(wèn)題。
Git優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1、適合分布式開(kāi)發(fā),強(qiáng)調(diào)個(gè)體。
2、公共服務(wù)器壓力和數(shù)據(jù)量都不會(huì)太大。
3、速度快、靈活。
4、任意兩個(gè)開(kāi)發(fā)者之間可以很容易的解決沖突。
5、離線(xiàn)工作。
缺點(diǎn):
1、學(xué)習(xí)周期相對(duì)而言比較長(zhǎng)。
2、不符合常規(guī)思維。
3、代碼保密性差,一旦開(kāi)發(fā)者把整個(gè)庫(kù)克隆下來(lái)就可以完全公開(kāi)所有代碼和版本信息。
tcp三次握手和四次揮手
自行補(bǔ)充
recycleview listview的優(yōu)缺點(diǎn)
recycler:
1、4級(jí)緩存
2、局部刷新
3、viewholder重用
4、動(dòng)畫(huà)
5、列表,瀑布流,
6、自己實(shí)現(xiàn)onclicklistener()
listview:
1、二級(jí)緩存
2、自己實(shí)現(xiàn)viewholder
3、沒(méi)有動(dòng)畫(huà),
4、不能局部刷新
5、自定義瀑布流
怎么設(shè)計(jì)一個(gè)框架,跨平臺(tái)和不跨平臺(tái)的方案
業(yè)務(wù)層:具體的業(yè)務(wù)模塊
組件層:網(wǎng)絡(luò),圖片,ui,mvp,打印機(jī),掃描,推送等,數(shù)據(jù)庫(kù)等等組件
底盤(pán)層:apm,推送
SharedPreferences進(jìn)程間為什么不安全
原因:只有在創(chuàng)建SharedPreferences對(duì)象的時(shí)候才會(huì)從磁盤(pán)中國(guó)進(jìn)行讀取,讀取完以后值保存在內(nèi)存(HashMap)當(dāng)中,下次獲取SharedPreferences對(duì)象優(yōu)先從緩存當(dāng)中獲取,所以在當(dāng)前進(jìn)程修改了SharedPreferences的值,其他進(jìn)程的SharedPreferences對(duì)象的值并不會(huì)改變。只有把當(dāng)前另外的進(jìn)程關(guān)閉(如:關(guān)閉手機(jī)、或殺死該app重新進(jìn)入),再次創(chuàng)建進(jìn)程時(shí)才會(huì)重新從磁盤(pán)中再次讀取文件。
sp在創(chuàng)建的時(shí)候會(huì)把整個(gè)文件全部加載進(jìn)內(nèi)存,如果你的sp文件比較大,那么會(huì)帶來(lái)幾個(gè)嚴(yán)重問(wèn)題:
第一次從sp中獲取值的時(shí)候,有可能阻塞主線(xiàn)程,使界面卡頓、掉幀。
解析sp的時(shí)候會(huì)產(chǎn)生大量的臨時(shí)對(duì)象,導(dǎo)致頻繁GC,引起界面卡頓。
這些key和value會(huì)永遠(yuǎn)存在于內(nèi)存之中,占用大量?jī)?nèi)存。
SharedPreferences 是線(xiàn)程安全的嗎?它的 commit 和 apply 方法有什么區(qū)別
1.SharePreferences是線(xiàn)程安全的 里面的方法有大量的synchronized來(lái)保障。
2.SharePreferences不是進(jìn)程安全的 即使你用了MODE_MULTI_PROCESS 。
3.第一次getSharePreference會(huì)讀取磁盤(pán)文件,異步讀取,寫(xiě)入到內(nèi)存中,后續(xù)的getSharePreference都是從內(nèi)存中拿了。
4.第一次讀取完畢之前 所有的get/set請(qǐng)求都會(huì)被卡住 等待讀取完畢后再執(zhí)行,所以第一次讀取會(huì)有ANR風(fēng)險(xiǎn)。
5.所有的get都是從內(nèi)存中讀取。
6.提交都是 寫(xiě)入到內(nèi)存和磁盤(pán)中 。apply跟commit的區(qū)別在于
apply 是內(nèi)存同步 然后磁盤(pán)異步寫(xiě)入任務(wù)放到一個(gè)單線(xiàn)程隊(duì)列中 等待調(diào)用。方法無(wú)返回 即void commit 內(nèi)存同步 只不過(guò)要等待磁盤(pán)寫(xiě)入結(jié)束才返回 直接返回寫(xiě)入成功狀態(tài) true or false
7.從 Android N 開(kāi)始, 不再支持 MODE_WORLD_READABLE & MODE_WORLD_WRITEABLE. 一旦指定, 會(huì)拋異常 。也不要用MODE_MULTI_PROCESS 遲早被放棄。
8.每次commit/apply都會(huì)把全部數(shù)據(jù)一次性寫(xiě)入到磁盤(pán),即沒(méi)有增量寫(xiě)入的概念 。 所以單個(gè)文件千萬(wàn)不要太大 否則會(huì)嚴(yán)重影響性能。
準(zhǔn)備好要問(wèn)的問(wèn)題
自行補(bǔ)充
greendao的優(yōu)缺點(diǎn)
1、方便快速開(kāi)發(fā),提高效率
缺點(diǎn):有些復(fù)雜sql語(yǔ)句不支持
事件分發(fā)機(jī)制,action_down,action_move,action_up的區(qū)別
1,ACTION_DOWN 事件決定著接下來(lái)的一系列事件的傳遞方向。返回TRUE ,則該一系列操作事件將由當(dāng)前View的onToucheEvent 處理。返回false 事件將繼續(xù)傳遞。直至返回Activity. Activity接收到其分發(fā)出去的ACTION_DOWN返回值false,則不再分發(fā)接下來(lái)的MOVE UP 事件。
2、dispatchTouchEvent 分兩種情況:ACTION_DOWN 時(shí)return 和 ACTION_MOVE 、ACTION_UP return 。ACTION_DOWN:返回TRUE和該View 的onTouchEvent ACTION_DOWN返回true 是一樣的即告訴activity 當(dāng)前View可以處理接下來(lái)的事件流。 返回false 結(jié)束事件剩下的也不再傳遞。ACTION_MOVE 、ACTION_UP :這種情況說(shuō)明其子View中已經(jīng)開(kāi)始處理事件流,在這里return直接導(dǎo)致該部分事件流不再繼續(xù)傳遞,對(duì)于沒(méi)有return的還按照正常的流程傳遞。
3、onInterceptTouchEvent 不論什么時(shí)候攔截,接下來(lái)的事件都將傳遞給當(dāng)前的onTouchEvent處理接下來(lái)的事件流。例如在當(dāng)前View的onInterceptTouchEvent 的ACTION_MOVE 中返回了true,則接下來(lái)的ACTION_MOVE、ACTION_UP都將傳遞給當(dāng)前view的onTouchEvent處理。其子View將不再接收處理剩下的事件。
1.在所有的事件微觀表現(xiàn)中,action_down是整個(gè)事件的基礎(chǔ),是任何宏觀事件的起始事件,一旦action_down return false,表示事件繼續(xù)向外層冒泡,當(dāng)有某一層的action_down
中return true,表示此層消費(fèi)了此action_down事件,那么在接下里的action_move、action_up等事件中,將直接先傳入此層中,且不管action_move、
action_up等返回false還是true,事件都不會(huì)繼續(xù)冒泡到外層。事件由此被消費(fèi)掉。
2.由此可以得知,action_down在整個(gè)事件傳遞中的重要作用。如果某層發(fā)生了action_move或者action_up微觀事件,那么一定發(fā)發(fā)生過(guò)action_down微觀事件。
關(guān)于setOnTouchListener、setOnClickListener和setOnLongClickListener:
Android中,有時(shí)候經(jīng)常見(jiàn)到針對(duì)同一控件可能設(shè)置不同的事件監(jiān)聽(tīng)器(如setOnTouchListener、setOnClickListener和setOnLongClickListener),對(duì)于這些事件監(jiān)聽(tīng)器的執(zhí)行順序,
setOnTouchListener是最先執(zhí)行的。并且只有當(dāng)此空間完整走完action_down和action_up流程后,才可能調(diào)用performClick()方法,及調(diào)用onclick執(zhí)行。而onLongClick則是在action_down
之后開(kāi)始,并且是在一個(gè)新的線(xiàn)程中去判斷按壓的時(shí)間,條件滿(mǎn)足則調(diào)用performLongClick()函數(shù),及調(diào)用onLongClick()函數(shù)。
二面:
1、怎樣檢測(cè)內(nèi)存泄露,生產(chǎn)上怎么定位內(nèi)存泄露
2、怎樣定位native層疊內(nèi)存泄露
3、bindservice和startservice的區(qū)別
4、怎樣不讓別人綁定我的service服務(wù)
5、音樂(lè)播放器怎樣實(shí)現(xiàn)退出頁(yè)面還可以播放
6、contentprovider插入一條數(shù)據(jù)要做那些操作
1.繼承contentprovider
2.重寫(xiě)6個(gè)抽象方法
ContentProvider的六個(gè)抽象方法的含義分別是:
onCreate():代表ContentProvider的創(chuàng)建,可以用來(lái)進(jìn)行一些初始化操作
getType(Uri uri):用來(lái)返回一個(gè)Uri請(qǐng)求所對(duì)應(yīng)的MIME類(lèi)型
insert(Uri uri, ContentValues values):插入數(shù)據(jù)
query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):查詢(xún)數(shù)據(jù)
update(Uri uri, ContentValues values, String selection, String[] selectionArgs):更新數(shù)據(jù)
delete(Uri uri, String selection, String[] selectionArgs):刪除數(shù)據(jù)
<provider
android:name=".MyContentProvider"
android:authorities="com.czy.contentprovideremo.MyContentProvider"
android:exported="true" />
name:ContentProvider的全稱(chēng)類(lèi)名
authorities:唯一標(biāo)識(shí)了一個(gè)ContentProvider,外部應(yīng)用通過(guò)該屬性值來(lái)訪(fǎng)問(wèn)我們的ContentProvider。因此該屬性值必須是唯一的,建議在命名時(shí)以包名為前綴
exported:表明是否允許其他應(yīng)用調(diào)用ContentProvider,true表示支持,false表示不支持。默認(rèn)值根據(jù)開(kāi)發(fā)者的屬性設(shè)置而會(huì)有所不同,如果包含 Intent-Filter 則默認(rèn)值為true,否則為false
看栗子:http://www.itdecent.cn/p/601086916c8f
7、數(shù)據(jù)庫(kù)事務(wù)和普通操作的區(qū)別,自己怎樣實(shí)現(xiàn)事務(wù)
8、內(nèi)存泄露有哪些,handler,單例,webview,具體場(chǎng)景,怎樣解決
handler
靜態(tài),弱引用,ondestroy移除removeallcallbacks
單例傳入applicaton的context,不要使用activity的或者是fragment的
webview采用單獨(dú)進(jìn)程,使用完成干掉進(jìn)程
9、touch的事件傳遞

10、怎樣在子線(xiàn)程啟動(dòng)handler
創(chuàng)建looper:Looper.prepare()
啟動(dòng)looper:Looper.loop()
11、浮窗是怎么實(shí)現(xiàn)的,window是由什么管理的
12、什么時(shí)候復(fù)寫(xiě) measure layout draw
13、measure方法是怎樣將大小傳遞給系統(tǒng)的
就是那個(gè)setMeasureDimension()

14、自定義控件的時(shí)候,canvas的save()和restore()的作用
save() : 用來(lái)保存Canvas的狀態(tài),save()方法之后的代碼,可以調(diào)用Canvas的平移、放縮、旋轉(zhuǎn)、裁剪等操作!
restore():用來(lái)恢復(fù)Canvas之前保存的狀態(tài)(可以想成是保存坐標(biāo)軸的狀態(tài)),防止save()方法代碼之后對(duì)Canvas執(zhí)行的操作,繼續(xù)對(duì)后續(xù)的繪制會(huì)產(chǎn)生影響,通過(guò)該方法可以避免連帶的影響
15、home按鍵的事件是怎么處理的
16、音量鍵是怎樣傳遞的
17、aidl的oneway的作用
oneway說(shuō)明是異步調(diào)用
18、怎樣獲取控件大小
在oncreate的時(shí)候獲取到的大小為0,需要使用
imageView.measure(0, 0);
int height = imageView.getMeasuredHeight();
int width = imageView.getMeasuredWidth();