我創建了一個測試程序,看看Android的服務被正確地回收後存在。Android的服務實例繼續的onDestroy()和GC
我創建了一個服務,做一兩件事:拿着WeakReference的一個對象。這個想法是,在Service被銷燬並且GC被調用之後,WeakReference應該返回null。這裏是我的服務:
package com.example.test.serviceleaktest;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import java.lang.ref.WeakReference;
public class MyService extends Service {
public static WeakReference sWeakReference = new WeakReference(null);
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
sWeakReference = new WeakReference("data");
Log.d("asdf", "MyService started");
return START_NOT_STICKY;
}
@Override
public void onCreate() {
super.onCreate();
Log.d("asdf", "MyService created");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("asdf", "MyService destroyed");
}
}
我使用Context.startService()啓動服務並使用Context.stopService()來停止它。 LogCat確認onDestroy()被調用。然後,我做了GC(代碼LeakCanary複製):
Runtime.getRuntime().gc();
Thread.sleep(100);
System.runFinalization();
在這一點上,我認爲sWeakReference.get()應該返回null,對不對?但它仍然返回分配的值。爲什麼?
相信有一個隱含的硬參照字符串文字'「數據」''經由= sWeakReference新的WeakReference(「數據」)'。試試'sWeakReference = new WeakReference(new String(「data」))'。順便提一下這個字符串的弱引用的意圖是什麼? – cziemba
謝謝。你是對的。 –