@Override
public Fragment getItem(int position) {
if (position < 0 || position >= getCount()) {
return new Fragment();
}
Fragment f = null;
if (!Requires.isNull(data[position])) {
f = data[position].get();
} else {
if (position == 0) {
f = HomeFragment.newInstance();
} else if (position == 1) {
f = DappFragment.newInstance();
} else if (position == 2) {
f = SettingsFragment.newInstance();
}
data[position] = new WeakReference<>(f);
}
return f;
}
@Override
public int getCount() {
return 3;
}
}
第一是懒加载方式,滑动到某个界面的时候,再构造对应的Fragment,同时Fragment使用弱引用包装。
public class SoftReference<T> extends Reference<T> {
static private long clock;
private long timestamp;
public SoftReference(T referent) {
super(referent);
this.timestamp = clock;
}
public SoftReference(T referent, ReferenceQueue<? super T> q) {
super(referent, q);
this.timestamp = clock;
}
public T get() {
T o = super.get();
if (o != null && this.timestamp != clock)
this.timestamp = clock;
return o;
}
}
public class WeakReference<T> extends Reference<T> {
public WeakReference(T referent) {
super(referent);
}
public WeakReference(T referent, ReferenceQueue<? super T> q) {
super(referent, q);
}
}
public class PhantomReference<T> extends Reference<T> {
// get()只会返回null
public T get() {
return null;
}
public PhantomReference(T referent, ReferenceQueue<? super T> q) {
super(referent, q);
}
}
可以看到,几种引用都提供了传入引用队列的构造器。
Reference类
public abstract class Reference<T> {
private T referent;
volatile ReferenceQueue<? super T> queue;
@SuppressWarnings("rawtypes")
Reference next;
transient private Reference<T> discovered;
static private class Lock { }
private static Lock lock = new Lock();
private static Reference<Object> pending = null;
private static class ReferenceHandler extends Thread {