android studio 常用外掛的實用
1.Butterknife Zelezny
1.說明:
butterknife是一個專注於Android系統的View注入框架,使程式碼更加簡潔。
2.支援特性
1.支援 Activity 中的 View 注入
2.支援 View 中的 View 注入
3.支援 View 事件回撥函式注入
目前支援如下事件回撥函式:
-
View: @OnLongClick and @OnFocusChanged.
-
TextView: @OnEditorAction.
-
AdapterView: @OnItemClick and @OnItemLongClick.
-
CompoundButton: @OnCheckedChanged
1.eclipse 中的使用 參考:http://jakewharton.github.io/butterknife/ide-eclipse.html
也可以參考部落格:http://www.cnblogs.com/MonkeyAC/articles/4242312.html
2.android studio 中的使用
<1.as 中settings -->plugins->瀏覽器中搜索Butterknife zelezny 安裝後重啟as.
<2.build.gradle中 新增:
compile 'com.jakewharton:butterknife:6.1.0'
<3.在activity 中使用時 新增 ButterKnife.inject(this); 右擊佈局檔案view ,選擇generate,再選擇generate butterknife injections ,最後點comfim 即可。
2.Gsonformat
1.說明:大多數服務端api都以json資料格式返回,而客戶端需要根據api介面生成相應的實體類。
2.使用方法:as 外掛中瀏覽器搜尋gsonformat 下載後重啟as.
在實體類中右鍵選擇generate 選擇gsonformat ,在輸入框中複製json 字串,點OK即可。
3.ParcelableGenerator
1.說明:Android中的序列化有兩種方式,分別是實現Serializable介面和Parcelable介面,但在Android中是推薦使用Parcelable,只不過我們這種方式要比Serializable方式要繁瑣,那麼有了這個外掛一切就ok了。
2.使用方法:
1.下載外掛:地址:https://github.com/mcharmas/android-parcelable-intellij-plugin/releases/tag/v0.6.3
2.as settings ->pulgins 選擇install pulgins from disk 安裝重啟即可。
3.選擇一個實體類,右鍵選擇generate->parcelable ,選中需要序列化的變數,點OK即可。
4.LeakCanary
1.說明:Square最近剛開源的一個非常有用的工具,強烈推薦,幫助你在開發階段方便的檢測出記憶體洩露的問題,使用起來更簡單方便。
記憶體洩漏:當一個物件已經不需要再使用了,本該被回收時,而有另外一個正在使用的物件持有它的引用從而導致它不能被回收,這導致本該被回收的物件不能被回收而停留在堆記憶體中,這就產生了記憶體洩漏。
先來分析下記憶體洩漏的原因:
1.資源物件沒關閉造成的記憶體洩漏。
2.構造Adapter時,沒有使用快取的convertView
3.Bitmap物件不在使用時呼叫recycle()釋放記憶體
4.試著使用關於application的context來替代和activity相關的context
5.註冊沒取消造成的記憶體洩漏
6.集合中物件沒清理造成的記憶體洩漏。
下面列舉一個因為資源物件沒關閉導致記憶體洩漏的例子,並用leakCanary檢測出來。
單例模式非常受開發者的喜愛,不過使用的不恰當的話也會造成記憶體洩漏,由於單例的靜態特性使得單例的生命週期和應用的生命週期一樣長,這就說明了如果一個物件已經不需要使用了,而單例物件還持有該物件的引用,那麼這個物件將不能被正常回收,這就導致了記憶體洩漏。如下這個典例:
public class TestModel { private static TestModel sInstance; private ImageView mView; private Context context; private TestModel(Context context){ this.context = context; } public static TestModel getInstance(Context context) { if (sInstance == null) { sInstance = new TestModel(context); } return sInstance; } public void setRetainedTextView(ImageView mView) { Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.lollipop); mView.setImageBitmap(bitmap); } }
這是一個普通的單例模式,當建立這個單例的時候,由於需要傳入一個Context,所以這個Context的生命週期的長短至關重要:
1、傳入的是Application的Context:這將沒有任何問題,因為單例的生命週期和Application的一樣長
2、傳入的是Activity的Context:當這個Context所對應的Activity退出時,由於該Context和Activity的生命週期一樣長(Activity間接繼承於Context),所以當前Activity退出時它的記憶體並不會被回收,因為單例物件持有該Activity的引用。
所以正確的單例應該修改為下面這種方式:
public class TestModel { private static TestModel sInstance; private ImageView mView; private Context context; private TestModel(Context context){ this.context = context.getApplicationContext(); } public static TestModel getInstance(Context context) { if (sInstance == null) { sInstance = new TestModel(context); } return sInstance; } public void setRetainedTextView(ImageView mView) { Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.lollipop); mView.setImageBitmap(bitmap); } }
這樣不管傳入什麼Context最終將使用Application的Context,而單例的生命週期和應用的一樣長,這樣就防止了記憶體洩漏。
回到問題的出發點,那我們要怎麼才能檢測出上面的記憶體洩漏情況呢,
1.首先as 中 gradle 中新增依賴
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
}
2.在 Application 中:
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}
如果檢測到某個 activity 有記憶體洩露,LeakCanary 就是自動地顯示一個通知。點選就可以檢視具體哪些物件存在記憶體沒有釋放的情況。