本教程內(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)行操作:
我們創(chuàng)建一個(gè)引用,但我們傳遞給了一個(gè)調(diào)用者,調(diào)用者將持有這個(gè)引用。
CloseableReference<Val> foo() {
Val val;
return CloseableReference.of(val);
}
創(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)事情了。
作為一個(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
在類(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ò)的引用。
}