前言
在学习Glide
的时候, 我们会看到Glide的二级缓存
, 分别分为内存缓存
和磁盘缓存
, 而不论哪种缓存都使用到了Lru
算法, 本篇主要看一下Android里的LruCache
的实现
燃烧了一颗恒星来相见
A拿了一串代码和一篇文章来问我,
...当productA变为null时(表明它所引用的Product已经无需存在于内存中),这时指向这个Product对象的就是由弱引用对象weakProductA了,那么显然这时候相应的Product对象时弱可达的,
所以指向它的弱引用会被清除,这个Product对象随即会被回收,指向它的弱引用对象会进入引用队列中。
根据文章上述引用内容, 当他在执行下文代码的putnull
方法时, 为什么userWeakReference.get()
对象不为null, 难道userWeakReference.get()
和 user
不是一个对象吗?1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36public class MainActivity extends AppCompatActivity {
private User user;
public static final int period = 2000;
private WeakReference<User> userWeakReference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
user = new User();
userWeakReference = new WeakReference<>(user);
Observable.interval(period, TimeUnit.MILLISECONDS)
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
Log.d("gc", String.format("user is %s null", (null == user) ? "" : "not") +
String.format(" ****" +
" userWeakReference.get() is %s null", (null == userWeakReference.get()) ? "" : "not"));
}
});
}
public void putnull(View view) {
Log.i("gc", "============ user = null ==============");
user = null;
}
public void excutegc(View view) {
Log.i("gc", "========== gc done =============");
System.runFinalization();
System.gc();
}
}