Я использую Weakreferences для обратного вызова в асинтете. В конструкторе асинтакты я даю список со ссылками. В моей ситуации список содержит 3 ссылки, 2 ссылки на фрагменты и 1 ссылку на класс java.Weakreference получить null в async task
Когда я проверяю список, который получает конструктор асинтакты, список содержит 3 (заполненные) ссылки. Я копирую их в локальный список (в asynctask). Когда я проверяю этот список, у него также есть 3 (заполненные) ссылки.
Затем выполняется асинхронная операция (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 анализирует xml на объекты с помощью библиотеки
AlertConverter: преобразует объект XML в объект я использую в моем приложении
Оба класса может работать без класса AsyncTask и не использовать ссылки.
Опубликовать код DoInBackgriound ... мы решили узнать, обрабатывается ли список другими методами ... –
WeakReference * is Предполагается, что в любой момент будет иметь значение null. –