【发布时间】:2013-06-07 00:18:52
【问题描述】:
我一直在尝试在我的 Android 项目中使用 WeakReference,但从未取得任何成功。现在我真的需要它,因为我正在处理旧设备,我必须尽可能保持内存清洁。
无论如何,我有一个数组,其中包含大约 1000 个不同字符串的列表。我需要加载它,然后在其中找到一个字符串。
这是我目前使用它的方式:
String[] campaignList = context.getResources().getStringArray(R.array.campaignList);
WeakReference<String[]> weakCampaignList = new WeakReference<String[]>(campaignList);
这是使用WeakReference的正确方法吗?
如果是,那么我不明白的是阵列在String[] 处得到水分,然后我将其传递给WeakReference。那么这是否意味着我在分配给一个数组的内存中有 2 个点?还是我完全误解了WeakReference 的概念?
我在所有资源中找到的一个非常好的资源是这个:
http://neverfear.org/blog/view/150/Strong_Soft_Weak_and_Phantom_References_Java
编辑:
我的代码可以正常工作。只需要知道我在性能方面做得是否正确。
for (int i = 0; i < weakCampaignList.get().length; i++) {
Log.d(TAG,"weakCampaignList: "+weakCampaignList.get()[i]);
}
我的整个方法
public static String getTheCampaign(String country, Context context) {
String campaign = "";
campaign = "annual_subscription_" + country;
String[] campaignList = context.getResources().getStringArray(
R.array.campaign_list);
ArrayList<WeakReference<String>> weakCampaignList = new ArrayList<WeakReference<String>>();
for (String s : campaignList) {
weakCampaignList.add(new WeakReference<String>(s));
}
if (country.equals("") || country.isEmpty()) {
campaign = "annual_subscription_us";
} else {
for (int i = 0; i < weakCampaignList.size(); i++) {
if (weakCampaignList.get(i).get().contains(campaign)) {
campaign = weakCampaignList.get(i).get();
return campaign;
}
}
}
return campaign;
}
【问题讨论】:
-
请遵循 Java 命名约定。这是
weakCampaingList和campaingList,而不是weak_campaing_list和campaingList。此外,您可能正在寻找的单词拼写为 campaign。 -
@MrH:仍然不清楚你想在内存中保留哪些对象,以及在什么情况下它们可以被 GC 处理。没有这些信息,任何人都无能为力。
-
oohhh 好的,现在我和你在一起,我不需要保留活动列表。
-
您是在尝试实现弱引用,还是尝试使用弱引用?如果 Dalvik VM 没有提供
WeakReference类供您使用(我认为这不太可能),您将需要实现弱引用,这需要对特定垃圾收集器的深入了解和集成在系统上使用。 -
是的,我正在尝试实现
WeakReference。在我阅读的几乎所有文档中,我发现每个人都建议WeakReferences或SoftReferences是用于内存管理的好方法。在我提出问题的链接中。现在我更困惑了。在Android开发中使用WeakReference好吗?当您提到“WeakReference 类”时,这就是您所指的:import java.lang.ref.WeakReference;然后是的。
标签: java performance memory-management weak-references