Android 面試技術(shù)點(diǎn)總結(jié)

前言
本文是作者年初換工作是總結(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篇

排序算法

排序算法性能對(duì)比.png

冒泡排序

依次比較相鄰兩個(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)

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-----------------
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末理盆,一起剝皮案震驚了整個(gè)濱河市痘煤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌熏挎,老刑警劉巖速勇,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晌砾,死亡現(xiàn)場(chǎng)離奇詭異坎拐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)养匈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門哼勇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呕乎,你說我怎么就攤上這事积担。” “怎么了猬仁?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵帝璧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我湿刽,道長(zhǎng)的烁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任诈闺,我火速辦了婚禮渴庆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘雅镊。我一直安慰自己襟雷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布仁烹。 她就那樣靜靜地躺著耸弄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卓缰。 梳的紋絲不亂的頭發(fā)上叙赚,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天老客,我揣著相機(jī)與錄音,去河邊找鬼震叮。 笑死胧砰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的苇瓣。 我是一名探鬼主播尉间,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼击罪!你這毒婦竟也來了哲嘲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤媳禁,失蹤者是張志新(化名)和其女友劉穎眠副,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竣稽,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡囱怕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毫别。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娃弓。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖岛宦,靈堂內(nèi)的尸體忽然破棺而出台丛,到底是詐尸還是另有隱情,我是刑警寧澤砾肺,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布挽霉,位于F島的核電站,受9級(jí)特大地震影響变汪,放射性物質(zhì)發(fā)生泄漏侠坎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一疫衩、第九天 我趴在偏房一處隱蔽的房頂上張望硅蹦。 院中可真熱鬧,春花似錦闷煤、人聲如沸童芹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽假褪。三九已至,卻和暖如春近顷,著一層夾襖步出監(jiān)牢的瞬間生音,已是汗流浹背宁否。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缀遍,地道東北人慕匠。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像域醇,于是被迫代替她去往敵國(guó)和親台谊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,520評(píng)論 25 707
  • 漂亮的百合花 我們都見過百合花,但唯獨(dú)姥姥家的百合我最喜歡譬挚。 ...
    仙草一朵閱讀 120評(píng)論 0 0
  • 故事的背景 再一個(gè)秋高氣爽的日子里锅铅,小主打算創(chuàng)造一個(gè)工具,這個(gè)工具可以根據(jù)項(xiàng)目中的代碼自動(dòng)生成文檔頁面减宣。這個(gè)工具需...
    溪離欣洛閱讀 9,836評(píng)論 4 9