編輯:關於Android編程
整理本人實際開發中遇到的一些問題以及解決辦法和一些開發技巧,以後會不定時更新。
tip:利用“目錄”可快速導航
問題來源:SwipeRefreshLayout源碼:判斷子View是否能向上滾動(或者是否滾動到頂部):
/**
* @return Whether it is possible for the child view of this layout to
* scroll up. Override this if the child view is a custom view.
*/
public boolean canChildScrollUp() {
if (android.os.Build.VERSION.SDK_INT < 14) {
if (mTarget instanceof AbsListView) {
final AbsListView absListView = (AbsListView) mTarget;
return absListView.getChildCount() > 0
&& (absListView.getFirstVisiblePosition() > 0 || absListView.getChildAt(0)
.getTop() < absListView.getPaddingTop());
} else {
return ViewCompat.canScrollVertically(mTarget, -1) || mTarget.getScrollY() > 0;
}
} else {
return ViewCompat.canScrollVertically(mTarget, -1);
}
}
進入Android開發官網,假如要查看View API的變化,輸入View,選擇android.view.View
,如圖:
進入View的API參考頁面(文檔頁),如圖:
vcj9uPbW99Kq0MXPoqO6PC9wPg0KVmlld8rH1NpBUEkgbGV2ZWwgMcztvNO1xCBWaWV3tcTA4LLjtM7NqLn91/Oy4LXEQVBJIGxldmVsIGNob29zZSBidXR0b24gv8nS1LLpv7Syu82sQVBJIGxldmVsz8K1xFZpZXcgQVBJo6y9+NDQ193P8rXEsum/tCzNrMqxv8nS1L2rsrvNrEFQSSBsZXZlbM/CtcRWaWV3IEFQSb340NC64c/yttSxyKGjDQo8cD7Xt8vdQVBJILHku6++zcrHzai5/cnPyva12sj9zPXKtc/WtcSho7HIyOfO0sPHz+u/tL+0QVBJIGxldmVsIDEzus0gQVBJIGxldmVsIDE01q685NPQyrLDtLHku6+jrL2r1/Oy4EFQSSBsZXZlbMno1sPOqjEzLLLpv7S3vbeowdCx7aO6PC9wPg0KPHA+PGltZyBhbHQ9"gray methods" src="/uploadfile/Collfiles/20160331/2016033109035752.png" title="\" />
我們會發現一些API 是灰色的,當鼠標hover過方法名時,會顯示出一個提示,如圖:
這個提示告訴我們:View中的canScrollVertically(int direction)
方法是在API level 14以後才添加的,另外canScrollHorizontally(int direction)
也是API level 14以後才添加的方法。當我把API level 切換到14時,發現上述兩個方法的顏色變為藍色了,說明他們的確是在API level 14添加的:
使用這種方法的好處是不用下載每一個api 版本的源代碼,也可以很方便的對比他們之間的變化。開發參考除了可以對比方法的變化以外,還可以對比內部類,接口等變化,當前選中的API level 為9,結果如圖:
問題來源:使用RxJava時,出現莫名的卡頓,方法嵌套過深,或類關系過於復雜,難以定位問題。
進入sdk->tools文件夾。雙擊運行monitor.bat
打開device monitor:
左側Device tab下是當前的設備名以及待調試應用的包名。在要測試某個操作(方法調用)之前,點擊method profiling 按鈕,彈出對話框:
輸入采樣間隔:
輸入采樣間隔,間隔越大,采集到某個方法調用棧的可能性就越小,可能漏掉某個調用棧,越小,采樣精度越高(或者說覆蓋率越高)但是采樣間隔太小,會導致卡頓。所以需要輸入一個合適的采樣間隔。輸入後點確認,然後在app上執行你的操作,執行完後點stop method profiling,會生成一個名為“ddms+時間戳+.trace”的文件,這個文件記錄了方法的調用棧信息,這個文件是我們分析的重點:
視圖中上一欄,展示了在method profile過程中並行執行的所有線程或進程。下一欄的表格展示了方法的調用信息,如方法名,所耗時間,cpu占用等。
表格中相關列名的說明:
點擊表格每一欄的名字可以進行排序,根據Name找到上述操作調用的方法,如fetchData:
Parents值得是fetchData的調用入口,而Children指的是fetchData方法中的子調用。
可以看出每個子調用或父調用的耗時情況,fetchData中的子調用fetchDataImpl耗時22.777ms,繼續點擊fetchDataImpl可以進入fetchDataImpl的調用棧,分析方式就同fetchData了,通過這種方式可以定位耗時操作的源頭:
使用method profiling可以分析方法的調用棧,找出app的性能瓶頸。android device monitor的功能很強大,是一個工具的合集,還可以分析Heap Dump,Allocation,Network,查看Device的文件等。好的工具可以提升開發效率,科學使用工具可以事半功倍。另外推薦一款在線app 冷啟動性能分析工具:Nimbledroid 可以分析app 冷啟動的調用棧,通過分析app冷啟動調用棧,可以找到影響app的啟動速度的因素。另外,Nimbledroid上可以查找到許多app不同版本的冷啟動調用棧信息,我們可以從中借鑒加速app啟動的方式。
以後會不定時更新,未完待續。
1、Service概述Service的主要作用是,讓系統可以在後台干一些不與用戶交互的操作,這些操作可能會比較耗時,比如去下載一些網絡資源等;也可能是一項長期運行的工作,
學習一下人家100日寫100個網頁的做法,我也用100日寫100個完整的Android程序。 這些程序的最基本要求: 1 完整性-每個程序都必須是獨立可運行的 2 不重復
1、概述優秀的圖片加載框架不要太多,什麼UIL , Volley ,Picasso,Imageloader等等。但是作為一名合格的程序猿,必須懂其中的實現原理,於是乎,今
使用Eclipse開發Android已經有些年頭了,然而Android Studio(後面簡稱AS)為谷歌自己推的IDE。現在AS已經出了2.0版本,其功能的確要比Ecl
Android應用程序窗口的繪圖表面在創建完成之後,我們就可以從上到下地