【我的複習向】Android學習過程 以及 問題集合

 

這篇博文記錄的是本人的Android學習過程,從Android基礎開始,到實際遇到的問題;html

橘色表示某一範圍內的知識點總結;綠色表示分散的小知識點。java

 


 

一,Activity 生命週期android

Activity是與用戶交互的接口,一個activity對應一個窗口。Android系統中是經過Activity棧的方式來管理Activity的,而Activity自身則是經過生命週期的方法來管理的本身的建立與銷燬。git

1. Activity的四種狀態github

Active/Running:
web

Activity處於活動狀態,此時Activity處於棧頂,是可見狀態,可與用戶進行交互。算法

Paused:數據庫

當Activity失去焦點時,或被一個新的非全屏的Activity,或被一個透明的Activity放置在棧頂時,Activity就轉化爲Paused狀態。但咱們須要明白,此時Activity只是失去了與用戶交互的能力,其全部的狀態信息及其成員變量都還存在,只有在系統內存緊張的狀況下,纔有可能被系統回收掉。canvas

Stopped:後端

當一個Activity被另外一個Activity徹底覆蓋時(失去焦點而且上層存在不透明的、非Dialog樣式的Activity),被覆蓋的Activity就會進入Stopped狀態,此時它再也不可見,可是跟Paused狀態同樣保持着其全部狀態信息及其成員變量,該Activity的數據會在RAM中暫時保留,一旦系統須要內存,這種處於Stopped狀態的Activity佔用的RAM空間會優先被清理並從新利用。因此,在Activity處於Stopped狀態時,必需要保存該Activity的UI狀態,不然一旦RAM空間被從新利用,UI狀態和數據就徹底丟失。

Killed:

當Activity被系統回收掉時,Activity就處於Killed狀態。不佔用RAM空間。

2. Activity的生命週期

典型的生命週期:建立,運行,中止,銷燬

onCreate

建立,它是生命週期第一個調用的方法,咱們在建立Activity時通常都須要重寫該方法,而後在該方法中作一些初始化的操做。不能在這個階段寫太多耗時的東西。

onStart

運行,此方法被回調時表示Activity正在啓動,此時Activity已處於可見狀態,只是尚未在前臺顯示,所以沒法與用戶進行交互。能夠簡單理解爲Activity已顯示而咱們沒法看見罷了。

onResume

運行,當此方法回調時,則說明Activity已在前臺可見,可與用戶交互了(處於前面所說的Active/Running形態)。

onPause

此方法被回調時則表示Activity正在中止(Paused形態),通常狀況下onStop方法會緊接着被回調。在onPause方法中咱們能夠作一些數據存儲或者動畫中止或者資源回收的操做,可是不能太耗時,由於這可能會影響到新的Activity的顯示——onPause方法執行完成後,新Activity的onResume方法纔會被執行。

onStop

通常在onPause方法執行完成直接執行,表示Activity即將中止或者徹底被覆蓋(Stopped形態),此時Activity不可見,僅在後臺運行。一樣地,在onStop方法能夠作一些資源釋放的操做(不能太耗時)。

onRestart

表示Activity正在從新啓動,當Activity由不可見變爲可見狀態時,該方法被回調。這種狀況通常是用戶打開了一個新的Activity時,當前的Activity就會被暫停(onPause和onStop被執行了),接着又回到當前Activity頁面時,onRestart方法就會被回調。

onDestroy

此時Activity正在被銷燬,也是生命週期最後一個執行的方法,通常咱們能夠在此方法中作一些回收工做和最終的資源釋放。

引用及擴展閱讀:

https://blog.csdn.net/qq_35559358/article/details/79715222

https://blog.csdn.net/qingxuan521721/article/details/78737080

 

二,MVP架構 (Presenter)

只知道MVC,MVP是MVC的改良。主要不清楚presenter的做用。

View:主要負責界面的顯示及跟數據無關的邏輯,好比設置控件的點擊事件等

Presenter:主要負責View與Model的交互

Model:數據部分

任何須要更新或者操做數據的,都間接經過Presenter對象去操做數據

Presenter層持有View層對象的引用,除此以外不持有其餘的UI控件等的引用,Model層會把想要更新View的操做委託Presenter去操做,而Presenter層會把更新View操做交給View層對象去操做。

 

三,瞭解 RxJava

a library for composing asynchronous and event-based programs using observable sequences for the Java VM

本質是實現異步操做的庫,利用了觀察者模式。

觀察者模式面向的需求是:A 對象(觀察者)對 B 對象(被觀察者)的某種變化高度敏感,須要在 B 變化的一瞬間作出反應。程序的觀察者模式,採用註冊(Register)或者稱爲訂閱(Subscribe)的方式,告訴被觀察者:我須要你的某某狀態,你要在它變化的時候通知我。相似OnClickListener

RxJava 的觀察者模式有部分不一樣,有四個基本概念

Observable (可觀察者,即被觀察者);Observer (觀察者);subscribe (訂閱);事件

RxJava的事件回調方法有:

onNext() 普通事件

onCompleted() 事件隊列完結。RxJava 不只把每一個事件單獨處理,還會把它們看作一個隊列。RxJava 規定,當不會再有新的 onNext() 發出時,須要觸發 onCompleted() 方法做爲標誌。

onError() 事件隊列異常。在事件處理過程當中出異常時,onError() 會被觸發,同時隊列自動終止,不容許再有事件發出。

線程切換:基本是依靠ObserveOn和SubscribeOn這兩個操做符來完成

引用及擴展閱讀:

http://gank.io/post/560e15be2dca930e00da1083#toc_1

 

四,瞭解Room數據庫

google本身的數據庫框架Room。

涉及到的概念:

Entity:具體的bean實體(一個對象類稱之爲一個javabean,不知道爲甚),會與數據庫表column進行映射

Dao:數據庫訪問對象,實現具體的增刪改查。

RoomDatabase:提供直接訪問底層數據庫實現,咱們應該從裏面拿到具體的Dao,進行數據庫操做。

引用及擴展閱讀:

https://www.jianshu.com/p/72c8efc3ad87

DAO層操做這個超級全:https://blog.csdn.net/u011897062/article/details/82107709#%E4%BF%A1%E6%81%AF%E6%9F%A5%E8%AF%A2

 

五,四大組件

Activity:展示爲一個可視化的用戶界面。這些activity一塊兒工做,共同組成了一個應用程序,但每一個activity都是相對獨立的。每一個activity都 是Activity(android.app.Activity)的子類。展現activity窗體的可視化內容區域是一些具備層次關係(很是像數據結構中的樹)的視圖,而視圖則是由類View的子類表示的。經過調用Activity.setContentView()方法來設置展示activity的窗體的視圖。

Service:Android系統的服務(不是一個線程,是主程序的一部分),與Activity不一樣,它是不能與用戶交互的,不能本身啓動的,需要調用Context.startService()來啓動,執行後臺,假設咱們退出應用時,Service進程並無結束,它仍然在後臺行。好比,service可能在用戶處理其餘事情的時候播放背景音樂,或者從網絡上獲取數據,或者執行一些運算,並把運算結構提供給activity展現給用戶。每個service都擴展自類Serivce。與activity以及其餘組件同樣,service相同執行在應用程序進程的主線程中。因此它們不能堵塞其餘組件或用戶界面,一般需要爲這些service派生一個線程執行耗時的任務。

Broadcase receiver:用於異步接收廣播Intent。

正常廣播 Normal broadcasts(用 Context.sendBroadcast()發送) 是全然異步的。沒有定義的順序。

有序廣播 Ordered broadcasts(用 Context.sendOrderedBroadcast()發送)每個receiver執行後可以傳播到下一個receiver,也可以全然停止傳播--不傳播給其它receiver。

專一於接收廣播通知信息,並作出相應處理。廣播接收器沒實用戶界面。然而,它們可以啓動一個activity來響應它們收到的信息,或者用NotificationManager來通知用戶。通知可以用很是多種方式來吸引用戶的注意力──閃動背燈、震動、播放聲音等等。

Content provider:用於對外共享數據,也就是經過ContentProvider把應用中的數據共享給其它應用訪問,其它應用可以經過ContentProvider對指定應用中的數據進行操做。ContentProvider分爲系統的和本身定義的,系統的也就是好比聯繫人,圖片等數據。

以上是四大組件,下面說一下也很重要的intent組件:

intent:一個保存着消息內容的Intent對象。對於activity和服務來講,它指明瞭請求的操做名稱以及做爲操做對象的數據的URI和其餘一些信息。比方說,它可以承載對一個activity 的請求,讓它爲用戶顯示一張圖片,或者讓用戶編輯一些文本。而對於廣播接收器而言,Intent對象指明瞭聲明的行爲。比方,它可以對所有感興趣的對象聲 明照相button被按下。對於每種組件來講,激活的方法是不一樣的。此處不贅述,須要閱讀,下面有連接~

Application:當android程序啓動時系統會建立一個 application對象,用來存儲系統的一些信息。一般咱們是不須要指定一個Application的,這時系統會自動幫咱們建立。

引用與擴展閱讀:https://www.cnblogs.com/hrhguanli/p/3961599.html

 

六,Android 佈局

時間有限,我是邊上手邊學的,因此這部分只記錄了我以爲難一點的地方。

 

Android 圓角、圓形 ImageView 實現

https://blog.csdn.net/jakezhang1990/article/details/79425879

用glide也是很好的選擇

若是圖片長寬不定,頗有可能出現上下兩條線或者左右兩條線的狀況,設置android:scaleType="centerCrop" 頗有用,參考以下:

https://www.cnblogs.com/nimorl/p/8081542.html

 

ConstraintLayout

https://blog.csdn.net/etwge/article/details/80433580

 

 

 

 

 

 

 

七,View 繪圖

1. onMeasure:

做用:

(1)通常狀況重寫onMeasure()方法做用是爲了自定義View尺寸的規則,若是你的自定義View的尺寸是根據父控件行爲一致,就不須要重寫onMeasure()方法
(2)若是不重寫onMeasure方法,那麼自定義view的尺寸默認就和父控件同樣大小,固然也能夠在佈局文件裏面寫死寬高,而重寫該方法能夠根據本身的需求設置自定義view大小

使用:

onMeasure有兩個參數 ( int widthMeasureSpec, int heightMeasureSpec),該參數表示控件可得到的空間以及關於這個空間描述的元數據。widthMeasureSpec和heightMeasureSpec這兩個值一般狀況下都是由父視圖通過計算後傳遞給子視圖的,說明父視圖會在必定程度上決定子視圖的大小。

specMode一共有三種類型,以下所示:
1. EXACTLY
表示父視圖但願子視圖的大小應該是由specSize的值來決定的,系統默認會按照這個規則來設置子視圖的大小,簡單的說(當設置width或height爲match_parent時,模式爲EXACTLY,由於子view會佔據剩餘容器的空間,因此它大小是肯定的)
2. AT_MOST
表示子視圖最多隻能是specSize中指定的大小。(當設置爲wrap_content時,模式爲AT_MOST, 表示子view的大小最可能是多少,這樣子view會根據這個上限來設置本身的尺寸)
3. UNSPECIFIED
表示開發人員能夠將視圖按照本身的意願設置成任意的大小,沒有任何限制。這種狀況比較少見,不太會用到。

PorterDuffColorFilter 

保持原來圖片的形狀,而切換圖片的顏色

 

ViewOutlineProvider

實現圖像矩形圓角效果

class RoundViewOutlineProvider extends ViewOutlineProvider {
        private float radius = 100f;
        private int diameter = 200;

        public RoundViewOutlineProvider(float radius) {
            this.radius = radius;
            this.diameter = (int) radius * 2;
        }

        @Override
        public void getOutline(View view, Outline outline) {
            int left = (view.getWidth() - diameter) / 2;
            int top = (view.getHeight() - diameter) / 2;
            int right = view.getWidth() - left;
            int bottom = view.getHeight() - top;
            outline.setRoundRect(left, top, right, bottom, radius);
        }
    }

 

 

 

 八,Android 動畫

https://www.jianshu.com/p/609b6d88798d

Android 中的動畫能夠分爲如下幾類: 逐幀動畫 補間動畫 屬性動畫。

1. 逐幀動畫的原理就是讓一系列的靜態圖片依次播放,利用人眼「視覺暫留」的原理,實現動畫。逐幀動畫一般是採用 XML 資源進行定義的,須要在 <animation-list .../> 標籤下使用 <item .../> 子元素標籤訂義動畫的所有幀,並指定各幀的持續時間。

2. 補間動畫就是指開發者指定動畫的開始、動畫的結束的"關鍵幀",而動畫變化的"中間幀"由系統計算,並補齊。補間動畫有四種:淡入淡出: alpha,位移:translate, 縮放:scale,旋轉: rotate

3. 屬性動畫能夠看做是加強版的補間動畫,與補間動畫的不一樣之處體如今:

屬性動畫能夠看做是加強版的補間動畫,與補間動畫的不一樣之處體如今:補間動畫只能定義兩個關鍵幀在透明、旋轉、位移和傾斜這四個屬性的變換,可是屬性動畫能夠定義任何屬性的變化。補間動畫只能對 UI 組件執行動畫,但屬性動畫能夠對任何對象執行動畫。

與補間動畫相似的是,屬性動畫也須要定義幾個方面的屬性:

  • 動畫持續時間。默認爲 300ms,能夠經過 android:duration 屬性指定。
  • 動畫插值方式。經過 android:interploator 指定。
  • 動畫重複次數。經過 android:repeatCount 指定。
  • 重複行爲。經過 android:repeatMode 指定。
  • 動畫集。在屬性資源文件中經過 <set .../> 來組合。
  • 幀刷新率。指定多長時間播放一幀。默認爲 10 ms。

 

主要學習屬性動畫:

參考引用:https://github.com/OCNYang/Android-Animation-Set/tree/master/property-animation

屬性動畫實現原理就是修改控件的屬性值實現的動畫。

類:咱們平時使用屬性動畫的重點就在於 AnimatorSet、ObjectAnimator、TimeAnimator、ValueAnimator。

屬性:Android 屬性動畫提供瞭如下屬性:

  • Duration:動畫的持續時間;
  • TimeInterpolation:定義動畫變化速率的接口,全部插值器都必須實現此接口,如線性、非線性插值器;
  • TypeEvaluator:用於定義屬性值計算方式的接口,有 int、float、color 類型,根據屬性的起始、結束值和插值一塊兒計算出當前時間的屬性值;
  • Animation sets:動畫集合,便可以同時對一個對象應用多個動畫,這些動畫能夠同時播放也能夠對不一樣動畫設置不一樣的延遲;
  • Frame refreash delay:多少時間刷新一次,即每隔多少時間計算一次屬性值,默認爲 10ms,最終刷新時間還受系統進程調度與硬件的影響;
  • Repeat Country and behavoir:重複次數與方式,如播放3次、5次、無限循環,可讓此動畫一直重複,或播放完時向反向播放;

 

貝塞爾曲線:

一、moveTo:不會進行繪製,只用於移動移動畫筆。

二、quadTo :用於繪製圓滑曲線,即貝塞爾曲線。

 mPath.quadTo(x1, y1, x2, y2) (x1,y1) 爲控制點,(x2,y2)爲結束點。一樣地,咱們仍是得須要moveTo來協助控制。

mPath.moveTo(100, 500);
mPath.quadTo(300, 100, 600, 500);
canvas.drawPath(mPath, mPaint);

效果如圖:

三、cubicTo:一樣是用來實現貝塞爾曲線的。

mPath.cubicTo(x1, y1, x2, y2, x3, y3) (x1,y1) 爲控制點,(x2,y2)爲控制點,(x3,y3) 爲結束點。多了一個控制點而已。

mPath.moveTo(100, 500);
mPath.cubicTo(100, 500, 300, 100, 600, 500);

結果和上圖同樣。

若是咱們不加 moveTo 呢?則以(0,0)爲起點,(100,500)和(300,100)爲控制點繪製貝塞爾曲線:

Android Animation運行原理

https://www.jianshu.com/p/fcd9c7e9937e

想要作更酷炫的效果,通常就須要涉及Animation的原理,Android使用一個3*3的矩陣處理平移、縮放、旋轉等動畫效果,假如咱們想要實現一個平移(a,b)以後旋轉(c,d)的動畫,那用Matrix的實現代碼就是這樣的:

 

 

    Matrix matrix = new Matrix();
    matrix.setTranslate(a, b);
    matrix.postScale(c, d);

Animation的applyTransformation()方法是空實現,具體實現它的是Animation的四個子類,而該方法正是真正的處理動畫變化的過程。applyTransformation()方法就是動畫具體的實現,系統會以一個比較高的頻率來調用這個方法,通常狀況下60FPS,是一個很是流暢的畫面了,也就是16ms。咱們能夠覆寫這個方法,快速的製做本身的動畫。

https://www.cnblogs.com/kross/p/4087780.html

 

Android運行時的動畫卡頓問題:

個人項目中,頁面不只在播放動畫,還在播放gif(承載動畫的view自己是一個gif),以及還在播放視頻,效果是有很明顯的卡頓和gif掉幀的。

問題出在內存泄漏,主線程任務過多,以及啓用GC頻繁。

我查了資料事後,使用瞭如下硬件加速,結果是沒效果。

通過查看GC啓用頻率,確實啓用的很是頻繁,想要減小GC,就要儘量少的建立臨時變量,因爲我使用的是屬性動畫,建立一個AnimatorSet和多個ObjectAnimation,確實不少,能夠嘗試這樣改改,看有沒有效果:

能夠按照下面這個博文的思路改代碼:

https://blog.csdn.net/rentee/article/details/52251829

====================改完代碼的分割線==========================

優化事後,發現內存佔用不只沒少反多了,emmmmm(沒有多不少)

反思了一下,我我的淺薄認爲,雖然減小了不少ObjectAnimation對象的建立,可是產生了許多PropertyValuesHolder 對象 以及 Keyframe 對象,並且個人動效比較複雜,常常穿插多個view的動畫,最終它們須要在一個set裏面,那麼仍是不可避免的須要建立ObjectAnimation。 因此改完代碼事後,臨時變量反而更多了,這些是個人猜想,可是確實在個人實驗中,這麼寫不起優化做用。

這時候看到了另外一個帖子:

https://blog.csdn.net/qiujuer/article/details/42531485

 

 

九,反射

https://blog.csdn.net/lwl20140904/article/details/80163880

爲何用:

1. private類

2. 須要拿到系統級的類

 

獲取Class對象的三種方式
1 Object ——> getClass();
2 任何數據類型(包括基本數據類型)都有一個「靜態」的class屬性
3 經過Class類的靜態方法:forName(String  className)(經常使用)

經常使用第三種方法

譬如說作SDK的時候,想要引用某個包的時候,能夠用這種方式,找獲得就用,找不到就不用。

GSON內部也是用反射找到輸出類型的類,並返回對象。

 

單例實現的效果是用來作內存級別的操做,實現緩存

 

 

緩存

內存緩存 紅位數 loser cache

內存緩存的意義是更快的用數據,能夠用各類算法。

 

 

十,WebView

WebView是android中一個很是重要的控件,它的做用是用來展現一個web頁面。它使用的內核是webkit引擎,4.4版本以後,直接使用Chrome做爲內置網頁瀏覽器。

https://www.jianshu.com/p/3e0136c9e748

 

 

 

 

原子操做

"原子操做(atomic operation)是不須要synchronized"

原子操做是指不會被線程調度機制打斷的操做;這種操做一旦開始,就一直運行到結束,中間不會有任何 context switch (切換到另外一個線程)。

若是把一個事務可看做是一個程序,它要麼完整的被執行,要麼徹底不執行(回滾)。這種特性就叫原子性。

 

經常使用的XML解析方法

sax:基於事件驅動,逐條解析,適用於只處理xml數據,不易編碼,並且很難同時訪問同一個文檔中的多處不一樣數據

dom:Dom解析是將xml文件所有載入到內存,組裝成一顆dom樹,而後經過節點以及節點之間的關係來解析xml文件,與平臺無關,java提供的一種基礎的解析XML文件的API,理解較簡單,可是因爲整個文檔都須要載入內存,不適用於文檔較大時。

JDOM:簡化與XML的交互而且比使用DOM實現更快,僅使用具體類而不使用接口所以簡化了API,而且易於使用

DOM4j:JDOM的一種智能分支,功能較強大,建議熟練使用

 

 

內部類和靜態內部類

內部類會持有外部類的對象,打印構造函數是能夠看到的,JVM在編譯階段會加進去。

1. 對象建立的方式不一樣
靜態內部類建立對象的時候,獨立於外部類及其對象,就好像它是一個獨立的類,能夠和外部類同樣使用。
內部類建立對象的時候,不能獨立於外部類,必需要先建立外部類的對象,而後再用這個對象來new出內部類的對象。

2. 內部類不能夠有很是量的靜態成員

緣由很簡單,靜態成員能夠不依賴於對象使用,若是內部類有靜態成員的話,就至關於外部類對象直接調用內部類的靜態成員,一個是對象,一個是類,不三不四的。

因此,要給內部類的定義靜態成員,必需要使用靜態內部類。

 

非靜態內部類是在外部類對象產生的時候纔會初始化,因此在沒有產生對象時,內部類自己尚未被初始化,這個時候聲明一個靜態成員,靜態成員必須在類加載的時候被加載,因此不能被聲明。

 

匿名內部類

https://blog.csdn.net/hellocsz/article/details/81974251

Listener就是用了匿名內部類。

若是想要在以後remove匿名內部類裏面的東西,就不要這麼寫了,拿不到句柄沒法remove。

 

 

接口和抽象方法

https://blog.csdn.net/frankfan123/article/details/79628034

 

 

設計模式——模板方法模式

https://www.cnblogs.com/chenpi/p/5217430.html

baseActivity 就是用到了這個。

 

 

setContentView 做用與用法

做用:給當前activity設置一個layout佈局

安卓裏的用戶界面放在res.layout下,爲xml文件,系統自動生成R類,R.layout自動獲取res.layout文件夾中的xml文件,再用該語句調用。以後就能夠看到頁面啦。

setContentView(R.layout.main);

 

findViewById 做用與用法

做用:獲取layout中的某個組件,以便於操做該組件,常見於view,button。

findViewById(R.id.xml文件中對應的idName)

 

Map<Integer, String> 和 set<Integer> 

set集合:元素不容許重複,無序,容許null但最多有一個。

HashMap:無序(Tree有序),遍歷Map過程當中,不能用map.put和map.remove,會引起 併發修改異常,能夠經過迭代器的remove(),從迭代器指向的 collection 中移除當前迭代元素來達到刪除訪問中的元素的目的。

Map不能用=賦值,用map.put(key,newVal)

// map初始化,以及set初始化和賦值
Map<Integer, String> map = new HashMap<>();
map.put(1, "hihihihihihi"); Set
<Integer> set = map.keySet(); //獲取map所有key

Java 遍歷Map時 刪除元素:https://www.cnblogs.com/wxmdevelop/p/5549548.html

 

final 的用法

final若是修飾類,該類不能被繼承;

final若是修飾變量,該變量不能被修改,不能再從新賦值,即變爲常量;

final若是修飾方法,該方法不能被重寫;

只有被final修飾的局部變量能夠用在內聯方法裏。

使用final的目的大概有如下兩條:

一、Java中內部類調用外部類局部變量時要final。

二、當咱們寫的代碼行已經不少的時候,本身可能就忘了以前的意圖,把button改了,結果就是:沒有按照咱們的意願運行,而後報錯。而final修飾後,是不容許修改的,就避免了這樣的錯誤。

引用:

https://www.jianshu.com/p/fd7ce9e3eecb

 

GSON

GSON是Google提供的用來在Java對象和JSON數據之間進行映射的Java類庫。能夠將一個Json字符轉成一個Java對象,或者將一個Java轉化爲Json字符串。

 

Handler的做用與用法

Handler是Android SDK來處理異步消息的核心類。子線程與主線程經過Handler來進行通訊。子線程能夠經過Handler來通知主線程進行UI更新。

 

個推,以及什麼透傳消息

文檔裏面有一句寫了:消息推送以個推的透傳消息實現。不知道這個透傳是什麼

透傳,即透明傳輸(pass-through),指的是在通信中無論傳輸的業務內容如何,只負責將傳輸的內容由源地址傳輸到目的地址,而不對業務數據內容作任何改變。

百科的意思大概就是東西是什麼就傳什麼,那爲何要這樣作呢?

透傳消息,就是消息體格式及內容,對於傳遞的通道來講是不去過問的,通道只負責消息的傳遞,對消息不作任何處理,當客戶端接收到透傳消息後,由客戶端本身來決定如何處理消息。正是由於透傳消息能夠自定義消息體,也能夠自定義消息的展現方式及後續動做處理,因此彌補了通知欄消息的一些不足之處(通知欄消息是直接展現出來,相關的動做客戶端沒法捕獲到)。

透傳消息是必須打開應用才能收到,通知是殺死應用也能收到。

看完仍是有點不懂,以及如何實現呢

引用和擴展閱讀:https://blog.csdn.net/u011136197/article/details/78921988

 

 pollFirst

 java.util.LinkedList.pollFirst() 方法檢索並移除此列表的第一個元素,或者若是此列表爲空,則返回null。

 

LinkedList

LinkedList 是一個繼承於AbstractSequentialList的雙向鏈表。它也能夠被看成堆棧、隊列或雙端隊列進行操做。

LinkedList<X> x= new LinkedList<>();

LinkedList.clear()  用於從連接列表中刪除全部元素。使用clear()方法只會清除列表中的全部元素,而不會刪除列表。換句話說,咱們能夠說clear()方法僅用於清空現有的LinkedList。

擴展閱讀:https://www.cnblogs.com/skywang12345/p/3308807.html

 

adb pull does not exist

必定要記得先adb remount一下,否則沒有讀寫權限,就找不到設備報does not exist的錯誤😭

 

實現list分紅20個爲一組

int userNum = list().size(); //
for ( int i = 0; i<=userNum/20; i++ ){
      List<String> whiteList = new ArrayList<>();
      for (int j = 0;j<20;j++){
           whiteList.add(list().get(i*20+j));
           if ( list().size() == i*20+j+1 ) break;
      }
      //功能代碼區
}

 

 java.lang.ExceptionInInitializerError

我在一次調用類函數的時候出現了Rxjava錯誤:UndeliverableException: The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the exception has nowhere to go to begin with.

用RxJavaPlugins.setErrorHandler(Throwable::printStackTrace); 抓下來,提示java.lang.ExceptionInInitializerError,因而去找解決辦法。

當在靜態初始化塊中出現了異常的時候,JVM會拋出 java.lang.ExceptionInInitializerError異常。具體來講是這個類加載失敗了,個人這個後面還跟着RuntimeException,指向類的構造函數。

 

extends

在Java中,經過關鍵字extends繼承一個已有的類,被繼承的類稱爲父類(超類,基類),新的類稱爲子類(派生類)。

 

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo

java.lang.ClassNotFoundException: Didn't find class "***" on path: DexPathList[[zip file

出現這個bug的緣由有不少,百度一下你能夠看到;我試過了網上能找到的全部方法都不行……找了前輩幫忙才解決,說一說我這裏報錯的緣由:類名的命名規範採用大駝峯命名法,必定要嚴格遵照!我一開始所有小寫,改爲開頭大寫就可了。

關於命名規範擴展閱讀:https://blog.csdn.net/wenzhi20102321/article/details/61650405

 

給Thread傳遞參數

https://www.cnblogs.com/larrylawrence/p/3517897.html

這個文給了我很好的想法,用另一個有參函數setTar()傳遞參數。或者能夠用回調

 

延遲執行

若是能夠用handler delay寫,儘可能不要起線程寫Thread.sleep。

 

a method on a null object reference

某方法在一個空指針引用裏,有兩種狀況:1. 實例對象沒有實例化 2. 調用的方法返回了NULL給實例,而後實例又去作操做。我檢查後發現確實是實例對象沒有實例化。

 

資源複用

新建對象會佔用cpu,對象的保留會佔用內存,銷燬也會佔用資源,特別是畫圖這類的動做。因此儘可能減小動做發生,一個解決辦法是創建回收機制/等待區,把不用的對象放在等待區,用的時候再引用它們。下面舉個栗子:


Android自定義屬性時TypedArray的使用方法

https://blog.csdn.net/qq_36523667/article/details/79289821

 

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

不能在子線程中更新ui

 

RxJava輪詢器:interval

https://www.jianshu.com/p/03958daf4b82

 

getInstance()

https://www.cnblogs.com/roadone/p/7977544.html 使用getInstance()方法的緣由及做用

總的來講:這是單例模式,通常用於比較大,複雜的對象,只初始化一次,應該還有一個private的構造函數,使得不能用new來實例化對象,只能調用getInstance方法來獲得對象,而getInstance保證了每次調用都返回相同的對象。

getInstance每每是static的。

 

Android實現兩個循環動畫之間互相中斷執行,clearAnimation()會致使的bug

中斷動畫用的clearAnimation(),若是此時動畫已經開始執行了,就不能阻止它完成,而且會執行onAnimationEnd;若是在這個階段,再一次執行這個動畫,而且做用在同一個view上,會致使以前clear掉的動畫又出現,而且此時兩個動畫在一個view上,互相牽制,這就是這個錯誤的表現,跟蹤會發現是這個view上有兩個動畫。
這種狀況會出現咱們想要在兩個動畫之間相互切換,A動畫在循環的過程當中被中斷,執行B動畫,而A動畫並不會馬上中斷,仍是會去執行onAnimationEnd,而在這個階段B動畫被中斷,執行A動畫,以前那個動畫也會被執行。

 

Warning: Static member accessed via instance reference

Warning:
Static member accessed via instance reference 經過引用實例來訪問靜態成員
Shows references to static methods and fields via class instance rather than a class itself. 經過類的實例來顯示靜態方法和變量的引用,而不是經過類自己

現有一個類Test,有靜態方法methods和靜態屬性fields。
對於靜態變量或方法,推薦使用的方式是Test.fields,而不是new Test().fields。
固然,使用this.fields也是不行的!由於this也指向一個實例對象。
若是出現以上告警,那必定是對於java不推薦的方式使用了靜態元素。

 

504錯誤

504錯誤是(網關超時) (Gateway timeout)  服務器做爲網關或代理,可是沒有及時從上游服務器收到請求。

這個問題徹底是由後端電腦之間 IP 通信緩慢而產生。

 

Shallow Size、Retained Size、Heap Size 和 Allocated

https://blog.csdn.net/strange_monkey/article/details/81746232

Shallow size就是對象自己佔用內存的大小,不包含其引用的對象。

Retained Size 就是該對象被 Gc 以後所能回收內存的總和。

Retained Size = 對象自己的Shallow Size + 對象能直接或間接訪問到的對象的Shallow Size

Heap Size:堆的大小,當資源增長,當前堆的空間不夠時,系統會增長堆的大小,若超過上限(如64M,閾值視平臺而定)則會被殺掉 。

Allocated:堆中已分配的大小,即 App 應用實際佔用的內存大小,資源回收後,此項數據會變小。

建議:若單一操做反覆進行,堆大小一直增長,則有內存泄露的隱患,可採用MAT進一步查看。

 

 

session

public key  發送給服務端,服務端再生成一個···

 

請求框架:

retrofit+okhttp

下載:downloadManager 支持斷點續傳……

 

getSimpleName名字會比getName更短。

 

Java反射機制:反射到名字變化多的地方,被混淆的東西,就會報錯,要注意。

模塊化的時候會用到;調用SDK的時候;調用第三方庫;調用系統 ……  的 private成員

註解

混淆

 

model.bin

部署模型https://www.jianshu.com/p/43da2553a2fb

 

 

播放器部分:

mediaplayer:

mediaplayer採用recycleview,有複用機制。可是傳入新數據的時候,就會new新的,可是以前的view

 

還能夠用exoplayer

 

 

final 和effectively final

針對於jdk1.8,對於一個變量,若是沒有給它加final修飾,並且沒有對它的二次賦值,那麼這個變量就是effectively final(有效的不會變的),若是加了final那確定是不會變了哈。就是這個意思。

在使用內部類的時候,一個外部變量不能直接被用,但若是它是final或者effectively final就能夠被內部類使用了。

相關文章
相關標籤/搜索