[英]Does Java create another strong reference instance from get() of WeakReference instance
[英]Get reference from WeakReference java
使用周參考有相同的方法嗎?
第一種方法:在構造函數中創建WeakReference obj並立即獲取我的Callbacks obj。
private static final class LoadImageFromUrl extends AsyncTask<Void, Void, Bitmap> {
private Callbacks mCallbacks;
public LoadImageFromUrl(String url, Callbacks callbacks) {
mCallbacks = new WeakReference<>(callbacks).get();
}
@Override
protected void onPostExecute(Bitmap bitmap) {
mCallbacks.successfully(bitmap);
}
第二種方法:在構造函數中創建WeakReference obj並在需要處理時獲取我的Callbacks obj。
private static final class LoadImageFromUrl extends AsyncTask<Void, Void, Bitmap> {
private WeakReference<Callbacks> mCallbacks;
public LoadImageFromUrl(String url, Callbacks callbacks) {
mCallbacks = new WeakReference<>(callbacks);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
mCallbacks.get().successfully(bitmap);
}
我認為這是類似的方式,但不完全相同。
在第一種情況下,創建WeakReference是沒有用的,因為您可以立即將其獲取值,然后將其存儲到強引用中(您的類的字段)
在第二種情況下,這是一個真正的弱引用:如果您的回調沒有其他強引用,則可能會被垃圾回收。 因此,在這種情況下, mCallbacks.get()
可以返回null。
為什么要將callback
保留為WeakReference
? 您是否閱讀過有關“ Strong
/ Weak
/ Soft
/ PhantomReferences
?
我建議您先獲得一些知識,然后再重新考慮您的解決方案。 示例文章
這是第二個版本,其中增加了檢查回調是否仍然存在的功能。
private static final class LoadImageFromUrl extends AsyncTask<Void, Void, Bitmap> {
private WeakReference<Callbacks> mCallbacks;
public LoadImageFromUrl(String url, Callbacks callbacks) {
mCallbacks = new WeakReference<>(callbacks);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
Callbacks cb = mCallbacks.get();
if (cb != null) cb.successfully(bitmap);
}
}
但這是合法但危險的實現,因為調用者需要保持強有力的引用。 而且並非總是如此,尤其是對於回調。 例如
void onCreate(..) {
...
new LoadImageFromUrl(new Callbacks() { void foo() .... }).execute();
...
}
將失敗,因為沒有任何東西可以對匿名內部實現進行嚴格的引用。 這是實現回調的常用方法。
半相關:請確保不要確保不將LoadImageFromUrl
任務擴展為內部類,因為由於每個內部類中都有隱式的ContainingClass.this
引用,這將導致它泄漏包含類。 那會打敗弱引用的目的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.