鍍金池/ 教程/ Android/ 可關閉的引用
進度條
在JAVA代碼中使用Drawees
Drawee的各種效果配置
緩存
一些陷阱
關于在Android Studio中編譯
多圖請求及圖片復用
自定義網(wǎng)絡加載
支持的URIs
可關閉的引用
監(jiān)聽下載事件
修改圖片
引入Fresco
縮放
圓角和圓圈
配置Image Pipeline
縮放和旋轉圖片
(圖片請求)Image Requests
自定義View
使用ControllerBuilder
在XML中使用Drawees
開始使用 Fresco
關鍵概念
Image Pipeline介紹
漸進式JPEG圖
數(shù)據(jù)源和數(shù)據(jù)訂閱者
直接使用Image Pipeline
動畫圖(gif)
使用其他的Image Loader

可關閉的引用

本教程內容來源于:http://fresco-cn.org
采用 知識共享 署名 4.0 國際 許可協(xié)議 進行許可

本頁內容僅為高級使用作參考

大部分的應用,直接使用Drawees就好了,不用考慮關閉的事情了。

Java帶有垃圾收集功能,許多開發(fā)者習慣于不自覺地創(chuàng)建一大堆亂七八糟的對象,并且想當然地認為他們會從內存中想當然地消失。

在5.0系統(tǒng)之前,這樣的做法對于操作Bitmap是極其糟糕的。Bitmap占用了大量的內存,大量的內存申請和釋放引發(fā)頻繁的GC,使得界面卡頓不已。

Bitmap 是Java中為數(shù)不多的能讓Java開發(fā)者想念或者羨慕C++以及C++眾多的指針庫,比如Boost 的東西。

Fresco的解決方案是: 可關閉的引用(CloseableReference)

為了正確地使用它,請按以下步驟進行操作:

1. 調用者擁有這個引用

我們創(chuàng)建一個引用,但我們傳遞給了一個調用者,調用者將持有這個引用。

CloseableReference<Val> foo() {
  Val val;
  return CloseableReference.of(val);
}

2. 持有者在離開作用域之前,需要關閉引用

創(chuàng)建了一個引用,但是沒有傳遞給其他調用者,在結束時,需要關閉。

void gee() {
  CloseableReference<Val> ref = foo();
  try {
    haa(ref);
  } finally {
    ref.close();
  }
}

finally 中最適合做此類事情了。

3. 除了引用的持有者,閑雜人等不得關閉引用

作為一個參數(shù)傳遞,調用者持有這個引用,在下面的函數(shù)體中,不能關閉引用。

void haa(CloseableReference<?> ref) {
  Log.println("Haa: " + ref.get());
}

如果調用了 .close(), 調用者嘗試調用 .get()時,會拋出IllegalStateException

4. 在賦值給變量前,先進行clone

在類中使用:

class MyClass {
  CloseableReference<Val> myValRef;

  void mmm(CloseableReference<Val> ref) {
    myValRef = ref.clone();
  };
  // caller can now safely close its copy as we made our own clone.

  void close() {
    CloseableReference.closeSafely(myValRef);
  }
}
// MyClass的調用者需要關閉myValRef

在內部中使用:

void haa(CloseableReference<?> ref) {
  final CloseableReference<?> refClone = ref.clone();
  executor.submit(new Runnable() {
    public void run() {
      try {
        Log.println("Haa Async: " + refClone.get());
      } finally {
        refClone.close();
      }
    }
  });
  // 當前函數(shù)域內可安全關閉,閉包內為已經(jīng)clone過的引用。
}