這篇博文記錄的是本人的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 組件執行動畫,但屬性動畫能夠對任何對象執行動畫。
與補間動畫相似的是,屬性動畫也須要定義幾個方面的屬性:
主要學習屬性動畫:
參考引用:https://github.com/OCNYang/Android-Animation-Set/tree/master/property-animation
屬性動畫實現原理就是修改控件的屬性值實現的動畫。
類:咱們平時使用屬性動畫的重點就在於 AnimatorSet、ObjectAnimator、TimeAnimator、ValueAnimator。
屬性:Android 屬性動畫提供瞭如下屬性:
貝塞爾曲線:
一、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
抓下來,提示java.lang.ExceptionInInitializerError,因而去找解決辦法。
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就能夠被內部類使用了。