簡體   English   中英

從WeakReference Java獲取參考

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM