前言
面試題:Java中的軟引用,弱引用在Android 是哪個的使用
目錄
- 一:哪四種引用
- 二:區(qū)別在哪
- 三:在Android中的使用場景
- Handler 弱引用蟋恬,防止內(nèi)存泄漏
- Bitmap軟引用防止OOM
- 參考
一:哪四種引用
- 強引用(Strong Reference)
- 軟引用(Soft Reference)
- 弱引用(WeakReference)
- 虛引用
二:區(qū)別在哪
1. 強引用(Strong Reference)
強引用是指在程序代碼中普遍存在的涤久,類似“Object obj=new Object()”這類的引用涡尘,只要強引用還存在,垃圾收集器永遠不會回收掉被引用的對象响迂。
只要某個對象有強引用與之關聯(lián)考抄,JVM必定不會回收這個對象,即使在內(nèi)存不足的情況下蔗彤,JVM寧愿拋出OutOfMemory錯誤也不會回收這種對象
2. 軟引用(Soft Reference)
軟引用是用來描述一些有用但并不是必需的對象川梅。對于軟引用關聯(lián)著的對象疯兼,只有在內(nèi)存不足的時候JVM才會回收該對象。因此挑势,這一點可以很好地用來解決OOM的問題镇防,并且這個特性很適合用來實現(xiàn)緩存:比如網(wǎng)頁緩存啦鸣、圖片緩存等潮饱。JDK 1.2之后,提供了SoftReference類來實現(xiàn)軟引用诫给。
import java.lang.ref.SoftReference;
public class Main {
public static void main(String[] args) {
SoftReference<String> sr = new SoftReference<String>(new String("hello"));
System.out.println(sr.get());
}
}
3.弱引用(WeakReference)
弱引用也是用來描述非必需對象的香拉,當JVM進行垃圾回收時,無論內(nèi)存是否充足中狂,都會回收被弱引用關聯(lián)的對象
import java.lang.ref.WeakReference;
public class Main {
public static void main(String[] args) {
WeakReference<String> sr = new WeakReference<String>(new String("hello"));
System.out.println(sr.get());
System.gc(); //通知JVM的gc進行垃圾回收
System.out.println(sr.get());
}
}
輸出結(jié)果
hello
null
4.虛引用(PhantomReference)
虛引用和前面的軟引用凫碌、弱引用不同,它并不影響對象的生命周期胃榕。在java中用java.lang.ref.PhantomReference類表示盛险。如果一個對象與虛引用關聯(lián),則跟沒有引用與之關聯(lián)一樣勋又,在任何時候都可能被垃圾回收器回收苦掘。
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
public class Main {
public static void main(String[] args) {
ReferenceQueue<String> queue = new ReferenceQueue<String>();
PhantomReference<String> pr = new PhantomReference<String>(new String("hello"), queue);
System.out.println(pr.get());
}
}
總結(jié)
對比 | 強引用 | 軟引用 | 弱引用 | 虛引用 |
---|---|---|---|---|
引用強度 | 最強 | 第二 | 第三 | 最弱 |
如何使用 | new Object() | SoftReference | WeakReference | PhantomReference |
三:在Android中的使用場景
1. Handler 弱引用,防止內(nèi)存泄漏
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import java.lang.ref.WeakReference;
public class MainActivity extends AppCompatActivity {
private Handler handler ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new MyHandler( this ) ;
new Thread(new Runnable() {
@Override
public void run() {
handler.sendEmptyMessage( 0 ) ;
}
}).start() ;
}
private static class MyHandler extends Handler {
WeakReference<MainActivity> weakReference ;
public MyHandler(MainActivity activity ){
weakReference = new WeakReference<MainActivity>( activity) ;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if ( weakReference.get() != null ){
// update android ui
}
}
}
}
2. Bitmap軟引用防止OOM
下面這段代碼是摘自博客:
http://blog.csdn.net/arui319/article/details/8489451
private Map<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();
<br>....
public void addBitmapToCache(String path) {
// 強引用的Bitmap對象
Bitmap bitmap = BitmapFactory.decodeFile(path);
// 軟引用的Bitmap對象
SoftReference<Bitmap> softBitmap = new SoftReference<Bitmap>(bitmap);
// 添加該對象到Map中使其緩存
imageCache.put(path, softBitmap);
}
public Bitmap getBitmapByPath(String path) {
// 從緩存中取軟引用的Bitmap對象
SoftReference<Bitmap> softBitmap = imageCache.get(path);
// 判斷是否存在軟引用
if (softBitmap == null) {
return null;
}
// 取出Bitmap對象楔壤,如果由于內(nèi)存不足Bitmap被回收鹤啡,將取得空
Bitmap bitmap = softBitmap.get();
return bitmap;
}
參考
http://blog.csdn.net/sunxianghuang/article/details/52267282