第一家公司
- 1:如果最快的獲取控件的寬高宣谈?
答:三種方法
1) 方法一 (此方法會加載onMeasure三次)
int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
imageView.measure(w, h);
int height =imageView.getMeasuredHeight();
int width =imageView.getMeasuredWidth();
textView.append("\n"+height+","+width);
```
2) 方法二(此方法會加載onMeasure二次展辞,但是回調(diào)函數(shù)會回調(diào)很多次 )
ViewTreeObserver vto = imageView.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
int height = imageView.getMeasuredHeight();
int width = imageView.getMeasuredWidth();
textView.append("\n"+height+","+width);
return true;
}
});
3) 方法三(此方法會加載onMeasure二次蕉朵,但是回調(diào)函數(shù)只回調(diào)一次)
ViewTreeObserver vto2 = imageView.getViewTreeObserver();
vto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
textView.append("\n\n"+imageView.getHeight()+","+imageView.getWidth());
}
});
- 2:View的分發(fā)機(jī)制?
具體請查看[Android View相關(guān)知識總結(jié)](http://www.reibang.com/p/91fa8faa6925)
- 3: invalidate()和postInvalidate()的使用與區(qū)別关顷?
Android中實(shí)現(xiàn)view的刷新有兩組方法糊秆,一組是invalidate,另一組是postInvalidate议双,其中前者是在UI線程自身中使用痘番,而后者在非UI線程中使用。
Android提供了Invalidate方法實(shí)現(xiàn)界面刷新平痰,但是Invalidate不能直接在線程中調(diào)用汞舱,因?yàn)樗沁`背了單線程模型:Android UI操作并不是線程安全的,并且這些操作必須在UI線程中調(diào)用
**利用invalidate()刷新界面**
實(shí)例化一個Handler對象宗雇,并重寫handleMessage方法調(diào)用invalidate()實(shí)現(xiàn)界面刷新;而在線程中通過sendMessage發(fā)送界面更新消息昂芜。
**使用postInvalidate()刷新界面**
使用postInvalidate則比較簡單,不需要handler逾礁,直接在工作線程中調(diào)用postInvalidate即可
- 4:多線程原理说铃?
第二家公司
- 1:圖片的三級緩存?
內(nèi)存-文件-網(wǎng)絡(luò)三層cache機(jī)制嘹履,其中內(nèi)存緩存包括強(qiáng)引用緩存和軟引用緩存(SoftReference),其實(shí)網(wǎng)絡(luò)不算cache债热,這里姑且也把它劃到緩存的層次結(jié)構(gòu)中砾嫉。當(dāng)根據(jù)url向網(wǎng)絡(luò)拉取圖片的時候,先從內(nèi)存中找窒篱,如果內(nèi)存中沒有焕刮,再從緩存文件中查找,如果緩存文件中也沒有墙杯,再從網(wǎng)絡(luò)上通過http請求拉取圖片配并。在鍵值對(key-value)中,這個圖片緩存的key是圖片url的hash值高镐,value就是Bitmap溉旋。所以,按照這個邏輯嫉髓,只要一個url被下載過观腊,其圖片就被緩存起來了邑闲。
- **1)、內(nèi)存緩存**
Java中對象的四種引用類型介紹
強(qiáng)引用
Java中所有new出來的對象都是強(qiáng)引用類型梧油,回收的時候苫耸,GC寧愿拋出OOM異常,也不回收它儡陨。
Map<String, Bitmap> mImageCache = new HashMap<>();
軟引用褪子,SoftReference
內(nèi)存足夠時,不回收骗村。內(nèi)存不夠時褐筛,就回收。這里使用這種方式緩存對象叙身。
Map<String, SoftReference<Bitmap>> mImageCache = new HashMap<>();
弱引用渔扎,WeakReference
GC一出來工作就回收它。
虛引用信轿,PhantomReference
用完就消失晃痴。
** 使用LruCache類來做緩存**
LruCache其實(shí)是一個Hash表,內(nèi)部使用的是LinkedHashMap存儲數(shù)據(jù)财忽。使用LruCache類可以規(guī)定緩存內(nèi)存的大小倘核,并且這個類內(nèi)部使用到了最近最少使用算法來管理緩存內(nèi)存。
LruCache<String, SoftReference<Bitmap>> mImageCache = new LruCache<>(1024 * 1024 * 4);
第三家公司
- 1:Dagger2原理即彪?
第四家公司
- 1:Service是否在主線程執(zhí)行紧唱?
service與activity一樣都存在與當(dāng)前進(jìn)程的主線程中,所以隶校,一些阻塞UI的操作漏益,比如耗時操作不能放在service里進(jìn)行,比如另外開啟一個線程來處理諸如網(wǎng)絡(luò)請求的耗時操作深胳。如果在service里進(jìn)行一些耗CPU和耗時操作绰疤,可能會引發(fā)ANR警告,這時應(yīng)用會彈出是強(qiáng)制關(guān)閉還是等待的對話框舞终。所以轻庆,對service的理解就是和activity平級的,只不過是看不見的敛劝,在后臺運(yùn)行的一個組件余爆,這也是為什么和activity同被說為Android的基本組件。
- 2:bindService和startService區(qū)別夸盟?
執(zhí)行startService時蛾方,Service會經(jīng)歷onCreate->onStartCommand。當(dāng)執(zhí)行stopService時,直接調(diào)用onDestroy方法转捕。調(diào)用者如果沒有stopService作岖,Service會一直在后臺運(yùn)行,下次調(diào)用者再起來仍然可以stopService五芝。
執(zhí)行bindService時痘儡,Service會經(jīng)歷onCreate->onBind。這個時候調(diào)用者和Service綁定在一起枢步。調(diào)用者調(diào)用unbindService方法或者調(diào)用者Context不存在了(如Activity被finish了)沉删,Service就會調(diào)用onUnbind->onDestroy。這里所謂的綁定在一起就是說兩者共存亡了醉途。
多次調(diào)用startService矾瑰,該Service只能被創(chuàng)建一次,即該Service的onCreate方法只會被調(diào)用一次隘擎。但是每次調(diào)用startService殴穴,onStartCommand方法都會被調(diào)用。Service的onStart方法在API 5時被廢棄货葬,替代它的是onStartCommand方法采幌。
第一次執(zhí)行bindService時,onCreate和onBind方法會被調(diào)用震桶,但是多次執(zhí)行bindService時休傍,onCreate和onBind方法并不會被多次調(diào)用,即并不會多次創(chuàng)建服務(wù)和綁定服務(wù)蹲姐。
- 2:內(nèi)存溢出和內(nèi)存泄漏有什么區(qū)別磨取?
內(nèi)存溢出 out of memory,是指程序在申請內(nèi)存時柴墩,沒有足夠的內(nèi)存空間供其使用忙厌,出現(xiàn)out of memory;比如申請了一個integer,但給它存了long才能存下的數(shù)拐邪,那就是內(nèi)存溢出慰毅。
內(nèi)存泄露 memory leak,是指程序在申請內(nèi)存后扎阶,無法釋放已申請的內(nèi)存空間,一次內(nèi)存泄露危害可以忽略婶芭,但內(nèi)存泄露堆積后果很嚴(yán)重东臀,無論多少內(nèi)存,遲早會被占光。
memory leak會最終會導(dǎo)致out of memory犀农!