オブジェクト throw インテントを転送したいのですが、オブジェクトが Serializable または parcelable を実装していません。だから私はこのようにそれを実現します:
private static Map<String, WeakReference<Object>> map = new HashMap<String, WeakReference<Object>>();
public static void saveObjectInIntent(Intent intent, String key,
Object value) {
String realKey = randomString();
map.put(realKey, new WeakReference<Object>(value));
if (intent != null) {
intent.putExtra(key, realKey);
}
}
public static Object getObjectFromIntent(Intent intent, String key) {
String realKey = intent.getStringExtra(key);
WeakReference<Object> weak = map.get(realKey);
if (weak != null) {
return weak.get();
}
return null;
}
しかし、アクティビティが終了しても、weakreference のオブジェクトが gc によってリサイクルされないことがわかりました。
だから私はそのようなテストを書きます:
Object obj = new Object();
ObjectTrsnferHelper.saveObjectInIntent(null, "a", obj);
obj = null;
obj もリサイクルされません。
なぜ ?
申し訳ありませんが、問題はありません。しかし、以前にテストコードを間違って書きました。
そのはず :
Set<String> keys = map.keySet();
for (String key : keys) {
WeakReference<Object> weak = map.get(key);
if (weak.get() == null) {
App.log(key + "被清除了");
}
}
前に「if(weak==null)」と書きました。