1. 程式人生 > >android studio 常用外掛的實用

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

    3.實用方法

       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 就是自動地顯示一個通知。點選就可以檢視具體哪些物件存在記憶體沒有釋放的情況。