我在asynctask中使用Weakreferences进行回调。在asynctask的构造函数中,我给出了一个带引用的列表。在我的情况下,该列表包含3个引用,2个片段引用和1个java类引用。
当我检查由asynctask的构造函数接收的列表时,列表包含3个(已填充的)引用。我将这些复制到本地列表(在asynctask中)。当我检查这个列表时,这也有3个(填充的)参考文献。
然后执行asynctask(doInBackground),它不会触及引用。当我在doInBackground方法的第一行检查带有断点的引用时,第3个(java类)引用为null。其他2个参考文献仍然填写。
直到明天一切正常。我检查了代码中的差异,但没有太大的区别。我试着把它们推回去没有结果。有人对此有解释吗?
我用这种方式创建了引用:
WeakReference<e_Alerts> wr = new WeakReference<e_Alerts>(this);
callbackReferences.add(new WeakReference<>((e_Alerts)tab_AlertListOverviewFragment));
callbackReferences.add(new WeakReference<>((e_Alerts)tab_AlertMapsOverviewFragment));
我使用的列表是一个简单的List<WeakReference<e_Alerts>> callbackReferences;
列表。
-------------------------------------------- ------------更新------------------------------------- -------------------
doInBackground代码:
try {
//Downloads the alert XMLs from the internet and parses it to xmlAlerts
this.alerts = new XmlDownloader().DownloadAlerts(inputUrl);
// Filters the xml alerts so only the alerts where the enduser is interessed in will remain
this.alerts = filterAlerts(this.alerts);
// Converts the remaining xmlAlerts to Alerts;
this.result = new AlertConverter().Convert(this.alerts);
}catch (Exception e) {
Log.e("At_allAlerts",e.getMessage());
}
return null;
filterAlerts方法:
private List<Item> filterAlerts(List<Item> alerts) {
List<Item> filteredXmlAlerts = new ArrayList<>();
for (Item alert : alerts)
{
Location alertLocation = new Location("");
alertLocation.setLatitude(alert.getGeometries().get(0).getLocations().get(0).getLat());
alertLocation.setLongitude(alert.getGeometries().get(0).getLocations().get(0).getLng());
for(Area area : this.areas)
{
if (area.IsOrganization() && alert.getCountryCode().toLowerCase().equals(area.getOrganizationcode().toLowerCase())){
filteredXmlAlerts.add(alert);
break;
}
else if(!area.IsOrganization() && isAlertInRegion(alertLocation, area)) {
filteredXmlAlerts.add(alert);
break;
}
}
}
return filteredXmlAlerts;
}
XmlDownloader:下载xml feed,将xml解析为具有库的对象
AlertConverter:将xml对象转换为我在我的应用程序中使用的对象
这两个类都可以在没有asynctask类的情况下工作,并且不使用引用。
答案 0 :(得分:1)
垃圾收集器可以在没有“强”引用的情况下释放/ null对象。可能是您使用的变量没有任何引用
的情况