前言
本文是作者年初換工作是總結(jié)的一些面試知識(shí)點(diǎn),從電腦的犄角旮旯找出來,給大家參考一下吧。
感興趣的朋友歡迎加入學(xué)習(xí)小組QQ群: 193765960。
版權(quán)歸作者所有,如有轉(zhuǎn)發(fā)龄寞,請(qǐng)注明文章出處:http://www.reibang.com/u/d43d948bef39
工具篇
eclipse使用
- MAT內(nèi)存分析工具:防止內(nèi)存泄漏,內(nèi)存抖動(dòng)等
- LeakCanery
Android Studio使用
JAVA篇
排序算法
冒泡排序
依次比較相鄰兩個(gè)元素的大小,符合比對(duì)條件則交換位置瞒渠。
public class SortUtil {
/**
* 冒泡排序:依次對(duì)比相鄰的兩個(gè)元素,大的話就交換位置帆卓;
* @param source
*/
public static void bubbleSort(int[] source){
int tmp = 0;
int len = source.length;
if(len == 0){
return;
}
for(int i=0; i<len-1; i++){
for(int j=0; j<len-1-i; j++){
if(source[j]>source[j+1]){
tmp = source[j+1];
source[j+1] = source[j];
source[j] = tmp;
tmp = 0;
}
}
}
}
}
快速排序
以某個(gè)元素值作為分界基準(zhǔn)值(一般選第一個(gè)元素)靶累,對(duì)數(shù)組元素從兩側(cè)進(jìn)行收縮比對(duì)扎狱,大于基準(zhǔn)值的元素在基準(zhǔn)值元素的右側(cè)多柑,小于基準(zhǔn)值元素的元素在左側(cè)豁生,通過遞歸的調(diào)用兔毒,對(duì)每次基準(zhǔn)值排序后的左右兩側(cè)元素?cái)?shù)組做同樣的排序漫贞。
public class SortUtil {
/**
* 快速排序
* @param source
*/
public static void quickSort(int[] source){
if(source.length ==0){
return;
}
quickSort(source,0,source.length-1);
}
/**
* 快速排序:對(duì)數(shù)組根據(jù)第一個(gè)元素進(jìn)行分治;
* @param source
*/
private static void quickSort(int[] source,int low, int high){
if(source.length == 0){
return;
}
if(low < high){
int mid = getMiddle(source,low,high);
quickSort(source,low,mid -1);
quickSort(source,mid+1,high);
}
}
/**
* 獲取source[low]的排序位置育叁,并基于source[low]為分界值做劃分
* @param source
* @param low
* @param high
* @return 基準(zhǔn)值在數(shù)組中的排序位置
*/
private static int getMiddle(int[] source,int low, int high){
if(source.length == 0){
throw new RuntimeException("length of source is 0");
}
//設(shè)置基準(zhǔn)值為比較區(qū)間的第一個(gè)元素值
int tmp = source[low];
//當(dāng)待排序的數(shù)組沒有完全收攏時(shí)迅脐,說明排序沒有完成
while (low<high){
//從高位向低位輪訓(xùn)找到第一個(gè)低于參考值的元素
while (low<high && source[high]>=tmp){
high--;
}
//高位元素置換到低位
source[low] = source[high];
//從低位向高位輪詢,找到第一個(gè)比參考值大的元素
while (low<high && source[low]<=tmp){
low++;
}
//高位元素置換到低位
source[high] = source[low];
}
source[low] = tmp;
return low;
}
}
歸并排序
對(duì)待排序的數(shù)組分為兩部分豪嗽,兩部分均為已排序數(shù)組谴蔑;對(duì)兩個(gè)數(shù)組進(jìn)行合并使其成為一個(gè)一個(gè)排序數(shù)組。
歸并排序的思想就是龟梦,迭代的進(jìn)行拆分(拆分到數(shù)組只有一個(gè)元素)合并
public class SortUtil {
public static void mergeSort(int[] source){
if(source.length == 0){
throw new RuntimeException("empty array");
}
int[] tmp = new int[source.length];
merge(source,0,source.length-1,tmp);
tmp = null;
}
private static void merge(int[] source ,int first, int last, int[] tmp){
if(first <last){
int mid = (first+last)/2;
merge(source,first,mid,tmp);//左邊有序
merge(source,mid+1,last,tmp);//右邊有序
merge(source,first,mid,last,tmp);//合并
}
}
private static void merge(int[] source ,int first, int mid, int last, int[] tmp){
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;
//將兩個(gè)有序數(shù)組合并為一個(gè)有序數(shù)組
while (i <= m && j <= n){
if (source[i] <= source[j]){
tmp[k++] = source[i++];
}else{
tmp[k++] = source[j++];
}
}
//如果左側(cè)數(shù)組還剩有元素隐锭,則追加到合并數(shù)組最后
while (i <= m){
tmp[k++] = source[i++];
}
//如果右側(cè)數(shù)組還有剩余元素,則追加到合并數(shù)組最后
while (j <= n){
tmp[k++] = source[j++];
}
//復(fù)寫原數(shù)組相應(yīng)的位置
for (i = 0; i < k; i++){
source[first + i] = tmp[i];
}
}
}
基礎(chǔ)篇
1. 面向?qū)ο蟮奶匦?/h2>
* 繼承
1)子承父業(yè)
2)final的方法不可重載
3)final的類不可繼承
* 封裝
1)類的設(shè)計(jì):高度相關(guān)的數(shù)據(jù)和方法才可以封裝在一個(gè)類里
2)隱藏細(xì)節(jié)计贰,暴露接口:更改細(xì)節(jié)對(duì)接口沒有影響
* 抽象(父類)
1)虛基類
2)接口類
3)抽出公共的屬性和方法
* 多態(tài)(子類)
1)向上轉(zhuǎn)型
2)依賴倒置
2. 面向?qū)ο笤O(shè)計(jì)的六大原則(SOLID_L)
1)子承父業(yè)
2)final的方法不可重載
3)final的類不可繼承
1)類的設(shè)計(jì):高度相關(guān)的數(shù)據(jù)和方法才可以封裝在一個(gè)類里
2)隱藏細(xì)節(jié)计贰,暴露接口:更改細(xì)節(jié)對(duì)接口沒有影響
1)虛基類
2)接口類
3)抽出公共的屬性和方法
1)向上轉(zhuǎn)型
2)依賴倒置
Android 設(shè)計(jì)模式:(一)面向?qū)ο蟮牧笤瓌t
單一職責(zé)原則(類的設(shè)計(jì)原則)
類應(yīng)該是一組“高度相關(guān)”的數(shù)據(jù)和操作的集合(高內(nèi)聚)開閉原則(如何保證版本修改和迭代的安全性)
對(duì)擴(kuò)展是開放的钦睡,對(duì)修改是關(guān)閉的(新的需求和業(yè)務(wù)要通過接口和代碼的新建實(shí)現(xiàn),不允許修改老的接口和代碼)里氏替換原則(如何實(shí)現(xiàn)靈活的系統(tǒng)架構(gòu))
利用接口編程的思想躁倒,構(gòu)建擴(kuò)展靈活的系統(tǒng)架構(gòu)依賴倒置原則(面向接口編程)
模塊間的依賴通過抽象實(shí)現(xiàn)荞怒,具體的實(shí)現(xiàn)類之間不能夠相互的依賴。接口隔離原則(接口的設(shè)計(jì)原則)
接口的功能盡量?jī)?nèi)聚和單一秧秉,以便可以靈活的復(fù)用接口褐桌,減少無用的方法暴露迪米特原則(最少知識(shí)原則)
低耦合,一個(gè)類應(yīng)該盡量只與自己有直接密切關(guān)系的類發(fā)生關(guān)系象迎。
3. Android系統(tǒng)的框架
4. Android系統(tǒng)的啟動(dòng)流程
5. 進(jìn)程和線程
* 進(jìn)程種類
* 前臺(tái)進(jìn)程
* 可見進(jìn)程
* 服務(wù)進(jìn)程
* 后臺(tái)進(jìn)程
* 空進(jìn)程
6. 進(jìn)程間通信
http://www.10tiao.com/html/227/201703/2650239000/1.html
- Intent 單向
- AIDL: 高并發(fā)量的通信
- android.os.Messenger: 串行荧嵌,簡(jiǎn)單的通信還可以,不適合大數(shù)據(jù)量并發(fā)
- Socket
7. 線程間通信
需要明確的價(jià)格概念:UI線程砾淌,工作線程(普通線程)完丽,looper線程
1)handler和message
2)共享內(nèi)存
3)異步任務(wù)
4)Rxjava
8. Android的四大組件
1)均工作于主線程,所以都不能執(zhí)行耗時(shí)工作拇舀,否則容易ANR
2)均需要在manifest文件中聲明
9. Android的啟動(dòng)模式
10. activity加載過程
11. activity和fragment的生命周期
* 生命周期
* activity的狀態(tài)保存機(jī)制
12. MVC
13. MVP
14. service
* 生命周期
* 啟動(dòng)模式
* service殺不死的實(shí)現(xiàn)方式
* service 和 Intentservice
service既不是獨(dú)立的進(jìn)程逻族,也不是獨(dú)立的線程,而是依托于app主線程的組件骄崩,因此service不能夠執(zhí)行耗時(shí)的工作聘鳞,否則會(huì)引起ANR.
intentservice是為了執(zhí)行耗時(shí)操作而來的,他繼承與service要拂,但是在oncreate的時(shí)候會(huì)開啟子線程來執(zhí)行耗時(shí)操作抠璃。
intentservice有一個(gè)虛方法onHandlerIntent(Intent intent),這個(gè)方法需要子類去實(shí)現(xiàn);
intentservice在oncreat中開啟線程HandlerThread,并使用HandlerThread的looper初始化一個(gè)serviceHandler脱惰,
在onstart方法中serviceHandler發(fā)消息搏嗡,serviceHandler收到消息后回調(diào)onHandlerIntent(Intent intent),然后結(jié)束service
15. layout常見布局
16. 廣播的注冊(cè)兩種方式和區(qū)別
17. 動(dòng)畫分哪幾類,各有什么特點(diǎn)和區(qū)別
* 補(bǔ)間動(dòng)畫(tween)
* 幀動(dòng)畫(fram)
* 屬性動(dòng)畫
18. 數(shù)據(jù)存儲(chǔ)方式(擴(kuò)展:安全存儲(chǔ))
加強(qiáng)篇
第一章:Material Design設(shè)計(jì)
1. Android6.0 Material Design FAB動(dòng)畫設(shè)計(jì)
2. Material Design Toolbar滑動(dòng)與隱藏
第二章:高級(jí)UI控件開發(fā)
1. 自定義控件
UI繪制流程 圖解Android:View的繪制機(jī)制與源碼解析
- viewtree的繪制機(jī)制
1)viewTree:activity-> phoneWindow -> DecorView -> LinearLayout: title + content: our layout
2)繪制的入口:ViewRootImpl: performTranversals(): performMeasure() -> performLayout() -> performDraw()
performMeasure: DecorView.measure(Match_parent,Match_parent) -> view.measure(Match_parent,Match_parent) -> override viewgroup.onMeasure()
事件傳遞機(jī)制 圖解Android:Touch事件傳遞機(jī)制
- U型模式(事件捕獲和事件的分發(fā)采盒、傳遞旧乞、消費(fèi))
* 事件沖突
* 動(dòng)畫
* 特效
2. 主流UI架構(gòu)設(shè)計(jì)
* 抽屜導(dǎo)航
* tab導(dǎo)航
3. 仿QQ空間個(gè)性化可拉伸頭部自定義空間
4. 消息列表拖動(dòng)排序
5. 微信字母導(dǎo)航通訊錄
6. 屬性動(dòng)畫(貝塞爾曲線)
7. 視差動(dòng)畫引導(dǎo)頁
8. Android實(shí)現(xiàn)IOS Reveal特效
9. 無限banner廣告輪播
10. viewpager滑動(dòng)動(dòng)畫特效
11. 3D菜單
12. 自定義衛(wèi)星菜單
13. 自己實(shí)現(xiàn)Material Design超炫加載過度特效
14. 沉浸式設(shè)計(jì)
第三章:IM即時(shí)通訊
1. XMPP協(xié)議
2. 長(zhǎng)連接心跳包方案
第四章:移動(dòng)架構(gòu)師
1. 插件式架構(gòu)設(shè)計(jì)
* 動(dòng)態(tài)加載技術(shù)
2. 緩存架構(gòu)設(shè)計(jì)
* 常見緩存算法:LRU,LFU,FIFO,Simple time-based,LargestLimitedMemoryCatch
3. IOC架構(gòu)設(shè)計(jì)
4. GIF動(dòng)畫引擎
5. 自定義動(dòng)畫框架
6. 熱補(bǔ)丁動(dòng)態(tài)修補(bǔ)
7. 設(shè)計(jì)模式 Android 設(shè)計(jì)模式:(一)面向?qū)ο蟮牧笤瓌t
* 單例模式
8. AOP框架
9. 網(wǎng)絡(luò)訪問框架
10. MVP架構(gòu)
MVC: Module層,View層磅氨,Controller層尺栖;
MVP: Module層,View層烦租,Presenter層延赌;
MVVM:Module層,View層叉橱,ViewModule層挫以;
1)MVC:
View層是指xml layout;
Controller層指Activity;
Android的mvc不是一個(gè)純粹的mvc模型,view層太弱窃祝,controller層太強(qiáng)屡贺,controller層兼具了view層的很多邏輯和處理;
缺點(diǎn):activity沒有和module解耦锌杀;activity本身承載著controller的職責(zé)和view的很多職責(zé)甩栈,導(dǎo)致activity會(huì)非常的臃腫,代碼邏輯會(huì)非常的復(fù)雜糕再。
有點(diǎn):業(yè)務(wù)邏輯簡(jiǎn)單
|---------| |---------| |---------|
| | ----> | | | |
| M | | C | ----> | V |
| | <---- | | | |
|---------| |---------| |---------|
2)MVP:
View層是指Activity和xml layout;
Presenter層綁定了view的接口邏輯和module的接口邏輯
|---------| |---------| |---------|
| | | | ---> O--| |
| M | <---- | P | | V |
| | | | <---- | |
|---------| |---------| |---------|
3)MVVM:
|---------| |---------| |---------|
| | | | | |
| M | <----> | VM | <----> | V |
| | | | | |
|---------| |---------| |---------|
11. RxJava響應(yīng)式架構(gòu)
12. 圖片加載框架
* Glide框架源碼分析
緩存策略:
lrumemorycatch
active resources(weakref map)
disckcatch -> bitmappool
network catch -> bitmappool
優(yōu)點(diǎn):
* 請(qǐng)求隊(duì)列具有生命周期量没,且與context的生命周期綁定:SupportRequestManagerFragment,RequestManagerFragment
* 更加強(qiáng)大的多級(jí)緩存策略:更加節(jié)省內(nèi)存突想,更快的加載速度殴蹄,更高的命中率
* 支持GIF,webp等格式
* 自定義圖片加載框架
第五章:NDK開發(fā)
1. NDK ffmpeg音頻處理
2. NDK實(shí)現(xiàn)360殺不死應(yīng)用
3. 增量更新
第六章:React Native
1. React Native實(shí)現(xiàn)原生開發(fā)+html5
第七章:Android性能優(yōu)化
1. 內(nèi)存優(yōu)化
1)內(nèi)存泄漏
內(nèi)存機(jī)制:靜態(tài)存儲(chǔ)區(qū)猾担;堆內(nèi)存袭灯;棧內(nèi)存
生命周期:生命周期長(zhǎng)的對(duì)象引用了生命周期短的對(duì)象,當(dāng)生命周期短的對(duì)象生命周期結(jié)束后不會(huì)被釋放而造成了內(nèi)存的泄漏绑嘹;
關(guān)鍵點(diǎn):?jiǎn)卫粌?nèi)部類;異步任務(wù)工腋;子線程姨丈;handler;靜態(tài)成員變量擅腰;
優(yōu)化策略:MAT工具查找內(nèi)存泄漏的地方蟋恬;代碼走查;
2)OOM錯(cuò)誤
擴(kuò)展:錯(cuò)誤和異常的關(guān)系
Error和Exception都繼承自Throwable; Exception 分為兩大類:RuntimeException 和 IOException;
Error和RuntimeException被稱為unchecked,有系統(tǒng)拋出趁冈,不需要也不應(yīng)該由程序員捕獲和拋出歼争;
IOException被稱為checked拜马,需要有程序員捕獲和拋出;
遇到Error沐绒,程序一般是無能為力的俩莽;
RuntimeException說明代碼存在錯(cuò)誤:
NullPointerException - 空指針引用異常
ClassCastException - 類型強(qiáng)制轉(zhuǎn)換異常。
IllegalArgumentException - 傳遞非法參數(shù)異常洒沦。
ArithmeticException - 算術(shù)運(yùn)算異常
ArrayStoreException - 向數(shù)組中存放與聲明類型不兼容對(duì)象異常
IndexOutOfBoundsException - 下標(biāo)越界異常
NegativeArraySizeException - 創(chuàng)建一個(gè)大小為負(fù)數(shù)的數(shù)組錯(cuò)誤異常
NumberFormatException - 數(shù)字格式異常
SecurityException - 安全異常
UnsupportedOperationException - 不支持的操作異常
3)ListView優(yōu)化:
復(fù)用convertView:
viewholder的使用:findviewbyid
onClickListener的使用
圖片的異步加載:Glide
viewtype:多種類型的item
ViewHolder基類的封裝:簡(jiǎn)化代碼
2. UI繪制優(yōu)化
1)Over Draw: 過度繪制 GPU過度繪制檢測(cè)
2)布局文件:扁平化;merge標(biāo)簽价淌,viewstub標(biāo)簽
3)圖片和背景色
3. 網(wǎng)絡(luò)請(qǐng)求優(yōu)化
1)架構(gòu):retroft+okhttp3+rxjava
2)request和response的封裝
3)緩存
4)生命周期
5)防抖
6)異常處理
7)網(wǎng)絡(luò)狀態(tài)監(jiān)聽
第八章:熱修復(fù)技術(shù):修復(fù)線上app的bug:
1. QQZone:全量補(bǔ)丁patch.dex
1)獲取當(dāng)前應(yīng)用的BaseDexClassLoader
2)通過反射得到應(yīng)用的DexPathList屬性對(duì)象pathlist
3)通過反射調(diào)用pathlist的dexElements方法申眼,把patch.dex轉(zhuǎn)化為Element[]
4)與原來的Element合并,把patch.dex放在最前面
5)加載Element[]
優(yōu)點(diǎn):
1)沒有合成整包蝉衣,產(chǎn)物比較小括尸,比較靈活。
2)可以實(shí)現(xiàn)類替換病毡,比較靈活
缺點(diǎn):
1)不支持即時(shí)生效濒翻,必須重啟才能生效
2)應(yīng)用中需要加入兩個(gè)dex,若果patch.dex中的類達(dá)到了一定的數(shù)量,就需要花不少的時(shí)間進(jìn)行加載啦膜。
3)在ART模式下有送,如果類修改了結(jié)構(gòu),就會(huì)出現(xiàn)內(nèi)存錯(cuò)亂問題僧家。
為了解決這個(gè)問題雀摘,就必須把所有的相關(guān)調(diào)用類,父類子類等都加入到patch.dex中八拱,導(dǎo)致補(bǔ)丁包異常的大阵赠。
2. 微信Tinker:差量補(bǔ)丁patch.dex
1)對(duì)比待修復(fù)的apk和修復(fù)后的apk,生成差量補(bǔ)丁patch.dex
2)開啟新進(jìn)程TinkerPatchService合并patch.dex和原來的dex
3)獲取當(dāng)前應(yīng)用的BaseDexClassLoader
4)通過反射得到應(yīng)用的DexPathList屬性對(duì)象pathlist
5)通過反射調(diào)用pathlist的makeDexElements方法肌稻,把合并后的dex直接替換到Element[]中去
優(yōu)點(diǎn):
1)合成整包清蚀,不用在構(gòu)造函數(shù)中插入代碼,防止verify和opt在編譯期間就已完成爹谭,不會(huì)在運(yùn)行期間進(jìn)行枷邪。
2)兼容性和穩(wěn)定性比較高
3)開發(fā)者透明,不需要對(duì)包進(jìn)行額外處理诺凡。
缺點(diǎn):
1)不支持即時(shí)生效齿风,需要重啟才可以
2)需要應(yīng)用開啟新的進(jìn)程才能進(jìn)行dex合并,并且很容易因?yàn)閮?nèi)存消耗等原因合并失敗。
3)合并時(shí)占用額外的磁盤空間绑洛,對(duì)于多dex的應(yīng)用來說救斑,
如果修改了多dex時(shí)就要生成多個(gè)patch.dex與對(duì)應(yīng)的classes.dex進(jìn)行合并,此時(shí)占用的空間更多真屯,因此合并過程的失敗率也會(huì)更高脸候。
3. HotFix(AndiFix的優(yōu)化版):通過運(yùn)行時(shí)在Native修改Filed指針的方式,實(shí)現(xiàn)方法的替換。
1)打開鏈接庫得到操作句柄
2)獲取native層內(nèi)部函數(shù)运沦,得到ClassObject對(duì)象
3)修改訪問權(quán)限屬性為public
4)得到新舊方法的指針
5)新方法指向目標(biāo)方法泵额,實(shí)現(xiàn)方法的替換
優(yōu)點(diǎn):
1)修復(fù)即使有效
2)補(bǔ)丁包采用差量技術(shù),生成的patch體積小
3)對(duì)應(yīng)用無侵入携添,幾乎無性能損耗
缺點(diǎn):
1)不支持新增字段嫁盲,不支持類替換,不支持對(duì)資源的替換烈掠,不支持修改<init>方法
2)由于廠商的自定義ROM羞秤,對(duì)少數(shù)機(jī)型暫不支持。
4. Dexposed
5. 美團(tuán)Robust: 基于Instant Run
第九章:組件化和模塊化
第十章:路由機(jī)制 Arouter
第十一章:RxJava
1.是什么左敌?
1.RxJava是一個(gè)庫
2.RxJava實(shí)現(xiàn)了由可觀察序列來組織的代碼邏輯:鏈?zhǔn)秸{(diào)用
3.RxJava實(shí)現(xiàn)了基于異步的瘾蛋,基于事件的鏈?zhǔn)秸{(diào)用機(jī)制
2.優(yōu)點(diǎn)
1.鏈?zhǔn)秸{(diào)用:代碼邏輯簡(jiǎn)潔
2.越來越多的框架采用了RxJava的框架
3.基本概念
被觀察者(對(duì)象):Observable
觀察者(對(duì)象):Observer
訂閱(注冊(cè)):Subscribe
事件(觀察者回調(diào)接口)
onNext()
onComplete()
事件隊(duì)列完畢(沒有新的next())
onError()
事件隊(duì)列異常:報(bào)出異常,并終止隊(duì)列
4.基本實(shí)現(xiàn)
1.創(chuàng)建Observer:
1)onNext()
2)onComplete()
3)onError()
最終使用的是Subscriber:Observer的子抽象類:
1)onNext()
正常返回時(shí)業(yè)務(wù)處理:例如界面刷新顯示
2)onComplete()
所有事件處理完畢時(shí)調(diào)用
例如:在此位置可以隱藏進(jìn)度條
3)onError()
當(dāng)前調(diào)用鏈任何一個(gè)環(huán)節(jié)報(bào)錯(cuò)都將終止流程矫限,并報(bào)錯(cuò)
例如:在此位置可以彈出異常
4)onStart():
subscriber的方法哺哼,在訂閱時(shí)(事件開始之前)調(diào)用,
例如:在此位置可以顯示進(jìn)度條叼风?取董??注意主線程
5)unsubscribe():
subscriber實(shí)現(xiàn)的接口subscription的方法无宿,\n用于取消訂閱甲葬。
例如:當(dāng)退出當(dāng)前界面時(shí),\n可以取消數(shù)據(jù)的拉去和界面的刷新
這個(gè)方法很重要懈贺,因?yàn)閟ubscribe之后经窖,\nobservable會(huì)保留對(duì)subscriber的引用姆泻,\n不調(diào)用該方法可能會(huì)內(nèi)存泄露
2.創(chuàng)建observable:
observable決定什么時(shí)候觸發(fā)事件啰脚,以及觸發(fā)什么事件橄镜。
被觀察者需要制定事件觸發(fā)規(guī)則财忽,即調(diào)用事件序列
oncreate(OnSubscribe?)
just(T...)
from(T[])
3.Subscribe()
Observable.subscribe(Subscriber)
public Subscription subscribe(Subscriber subscriber) {
......
subscriber.onStart();
......
onSubscribe.call(subscriber);
......
return subscriber;
}
Observable.subscribe(Observer)
4.Scheduler
調(diào)度器膀曾,用于實(shí)現(xiàn)異步機(jī)制\n即后臺(tái)處理晶框,前臺(tái)回調(diào)
在不指定線程的情況下拐纱,\nRxJava遵循在哪個(gè)線程subscribe()于毙,\n就在哪個(gè)線程產(chǎn)生事件皮迟;\n在那個(gè)線程產(chǎn)生事件搬泥,就在哪個(gè)線程消耗事件。\n如果想要多線程異步處理伏尼,就要使用scheduler
Scheduler API
Scheduler.immediate()
運(yùn)行在當(dāng)前的線程
Scheduler.newThread()
啟用新線程忿檩,并在新線程執(zhí)行事件
Scheduler.io()
I/O操作的scheduler,相比newThread()爆阶,\n使用無數(shù)量上限的線程池燥透,可線程重用沙咏,因此其更有效率
Scheduler.computation()
計(jì)算所使用的scheduler,\n使用數(shù)量固定的線程池班套,\n用于CPU的高密度計(jì)算肢藐。\n不要把I/O操作放在該scheduler
Androidscheduler.mainThread()
主線程
subscribeon()
指定事件發(fā)生的線程
observeron()
指定事件消費(fèi)的線程
5.Operater
所謂變換,就是將事件序列中的對(duì)象或者整個(gè)事件序列進(jìn)行處理吱韭,\n轉(zhuǎn)換成新的事件序列或事件
API
map()
事件對(duì)象的轉(zhuǎn)換
flatmap()
事件序列轉(zhuǎn)換成新的observable事件序列
switchmap()
相比flatmap,switchmap可以停止之前發(fā)出的事件
filter()
過濾:傳入過濾條件
take()
截取數(shù)量
doOnNext()
在subscriber消費(fèi)事件之前被調(diào)用
throttleFirst()
在每次時(shí)間觸發(fā)后一定時(shí)間內(nèi)丟棄新的事件吆豹,\n常用作去抖,比如按鍵去抖
變換的原理
lift()
針對(duì)事件項(xiàng)和事件序列的轉(zhuǎn)換
compose()
針對(duì)observable本身的整體轉(zhuǎn)換
第十二章 電量?jī)?yōu)化
1.無線電波狀態(tài)機(jī)
1)FullPower
2)LowPower
3)StandBy
FullPower ---5s---> LowerPower ---12s---> StandBy ---2s---> FullPower
| ^
| |
-------------------1.5s-----------------