使用周参考是否相同?
第一种方式:在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);
}
我认为它有类似的方式,但并不完全相同。
答案 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
引用,它将导致它泄漏包含类。这会破坏弱引用的目的。