在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

可關(guān)閉的引用

本教程內(nèi)容來(lái)源于:http://fresco-cn.org
采用 知識(shí)共享 署名 4.0 國(guó)際 許可協(xié)議 進(jìn)行許可

本頁(yè)內(nèi)容僅為高級(jí)使用作參考

大部分的應(yīng)用,直接使用Drawees就好了,不用考慮關(guān)閉的事情了。

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

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

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

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

為了正確地使用它,請(qǐng)按以下步驟進(jìn)行操作:

1. 調(diào)用者擁有這個(gè)引用

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

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

2. 持有者在離開(kāi)作用域之前,需要關(guān)閉引用

創(chuàng)建了一個(gè)引用,但是沒(méi)有傳遞給其他調(diào)用者,在結(jié)束時(shí),需要關(guān)閉。

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

finally 中最適合做此類(lèi)事情了。

3. 除了引用的持有者,閑雜人等不得關(guān)閉引用

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

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

如果調(diào)用了 .close(), 調(diào)用者嘗試調(diào)用 .get()時(shí),會(huì)拋出IllegalStateException

4. 在賦值給變量前,先進(jìn)行clone

在類(lèi)中使用:

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的調(diào)用者需要關(guān)閉myValRef

在內(nèi)部中使用:

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();
      }
    }
  });
  // 當(dāng)前函數(shù)域內(nèi)可安全關(guān)閉,閉包內(nèi)為已經(jīng)clone過(guò)的引用。
}