弱同步在异步任务中变为空

时间:2016-03-30 11:19:09

标签: android android-asynctask weak-references asynccallback

我在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类的情况下工作,并且不使用引用。

1 个答案:

答案 0 :(得分:1)

垃圾收集器可以在没有“强”引用的情况下释放/ null对象。可能是您使用的变量没有任何引用

的情况