本教程內容來源于: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)
為了正確地使用它,請按以下步驟進行操作:
我們創(chuàng)建一個引用,但我們傳遞給了一個調用者,調用者將持有這個引用。
CloseableReference<Val> foo() {
Val val;
return CloseableReference.of(val);
}
創(chuàng)建了一個引用,但是沒有傳遞給其他調用者,在結束時,需要關閉。
void gee() {
CloseableReference<Val> ref = foo();
try {
haa(ref);
} finally {
ref.close();
}
}
finally
中最適合做此類事情了。
作為一個參數(shù)傳遞,調用者持有這個引用,在下面的函數(shù)體中,不能關閉引用。
void haa(CloseableReference<?> ref) {
Log.println("Haa: " + ref.get());
}
如果調用了 .close()
, 調用者嘗試調用 .get()
時,會拋出IllegalStateException
在類中使用:
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過的引用。
}