从WeakReference java获取参考

时间:2015-11-30 19:15:15

标签: java android

使用周参考是否相同?

第一种方式:在contstructor中创建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);
    }

第二种方式:在contstructor中创建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);
    }

我认为它有类似的方式,但并不完全相同。

3 个答案:

答案 0 :(得分:0)

在第一种情况下,制作WeakReference是没用的,因为你立刻得到它的值,把它存储到一个强引用(你的类的字段)

在第二种情况下,它是一个真正的弱引用:如果你的回调没有其他强引用,它可能是垃圾收集。因此mCallbacks.get()在这种情况下可能会返回null。

答案 1 :(得分:0)

为什么要将callback作为WeakReference保留?您是否阅读了有关Strong / Weak / Soft / PhantomReferences的任何内容?

我建议你先了解一下,然后重新思考你的解决方案。 Example article

答案 2 :(得分:0)

它是第二个版本,增加了检查回调是否仍然存在。

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引用,它将导致它泄漏包含类。这会破坏弱引用的目的。