0

Я использую 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 и не использовать ссылки.

+0

Опубликовать код DoInBackgriound ... мы решили узнать, обрабатывается ли список другими методами ... –

+0

WeakReference * is Предполагается, что в любой момент будет иметь значение null. –

ответ

1

Сборщик мусора может создавать свободные/нулевые объекты без «сильной» ссылки. Это может быть так, что используемые вами переменные не имеют ссылок

+0

Спасибо за ваш ответ, но по какой-то странной причине проблема решена им самим. Я удалил приложение вручную с моего телефона (для тестирования первой инициализации), и с этого момента все работает отлично. Я проверил изменения (в истории) с кланами в данный момент из этого сообщения, поэтому я могу найти объяснение, почему он был сломан и исправлен снова, но есть 0.0 изменений ....... Я не понимаю, но это работает так i'am happy :-D – RoDo

+0

Я нашел что-то еще ... проблема не «волшебным образом ушла» .... Когда я запускаю приложение, первый раз, когда местоположение gps запрашивается классом gpsManager диспетчером предупреждений , Когда я отключу, что приложение получает местоположение gps '(if gpsEnabled) {gpsManager.getGps();}' класс gps (с помощью приемника местоположения), то ссылка Alertmanager ссылается на null else, а не на ..... – RoDo