0

Я только начал использовать SoftReference в моей реализации Фрагмент, который устанавливает setRetainInstance Истина, и у меня есть вопрос относительно ..Android SoftReference Для пользовательского класса, содержащего AyncTask

Обзор:
Я «Выполнение - это создание списка мягких ссылок, чтобы иметь возможность запускать несколько Асинхронных задач и сохранять ссылки. НО, мой список содержит ссылки на пользовательские объекты класса, которые обертывают AsyncTask, но не сами.

Вопрос:
Будет ли поведение SoftReference остаются теми же?
Будет ли Android «парировать» мой фрагмент и все те AsyncTask, или я пропущу
вся идея, сделав это?

Пример кода:

public class myFragment extends Fragment{ 
    List<SoftReference<MyClass>> myList; 
    ... 
} 

public class MyClass{ 
    private AsyncTask task; 
    ... 
} 

Edit: Я изменил вопрос на SoftReference вопрос после того, как комментарий NKN в о WeakReference "слишком слаб". Thx для этого ..
вопрос все еще остается, хотя :)

+0

Be ** very ** тщательно используя 'WeakReferences' в Android. Имейте в виду, что приложение имеет макс. 16 Мбайт памяти, поэтому память собрана с гораздо большей частотой, чем в обычных фреймворках Java. Я бы предложил использовать минимально «SoftReference» и всегда проверять объекты на возможные освобожденные экземпляры. – nKn

+0

Спасибо! Сейчас я перехожу на SoftReference. Я действительно знал это и забыл хе .. Кроме того, я обертываю все свои «get()» с помощью try & catch для случаев, когда ссылка потеряна. –

ответ

1

Если я понял вашу идею правильно, вы хотите иметь массив AsyncTask экземпляров, которые вы контролируете. В этом случае, поскольку они, вероятно, достаточно критически важных данных для хранения их в SoftReference и подвергая опасности их содержимое из-за сборщика мусора, я лично изменил бы подход SoftReference, чтобы воспользоваться структурой AsyncTask.

Я бы сказал, что ArrayList, но непосредственно из MyClass экземпляров (не SoftReferences). Вы можете реализовать метод в своем классе MyClass, например setTaskId(int), и перед выполнением какой-либо задачи вы должны вызвать его, например, с индексом в вашем ArrayList этого экземпляра.

Вы бы затем вызвать метод execute(), и как только вы завершение работы, что AsyncTask, метод onPostExecute() будет называться, из которого вы хотите вызвать метод в вашем Fragment сказать, что это экземпляр AsyncTask уже закончился , и вы можете просто использовать yourArrayList.delete(on_that_id).

На ваш вопрос вы упомянули, что у вас есть несколько AsyncTasks. Вы можете слить столько, сколько хотите, но read this, прежде чем делать это, потому что метод execute()AsyncTask подвергся кардинальным изменениям в изменениях версии, и вам может понадобиться соответствующий код для них.

--- EDIT ---

Использование AsyncTask сек в Fragments имеет дополнительное осложнение, к тому времени, AsyncTask закончил, именно так, как вы прокомментируете, это может быть отсоединена. Таким образом, вам придется реализовать дополнительные логические механизмы, чтобы проверить, подключено ли оно через isDetached(). Имейте в виду, что isDetached() работает только в том случае, если вы явно отключили свой Fragment, иначе вам понадобится isAdded().

Вам не нужно использовать его все время, просто имейте в виду Fragment lifecycles и назовите его, когда вам нужно будет сделать действие, которое связано с подключением Fragment.

Чтобы упростить это немного, вы можете переместить AsyncTask инициализации и логику к родительскому деятельности, поэтому если Fragment отсоединяется он может действовать надлежащим образом (как, например не отбрасывая результаты, если фрагмент больше не прилагается, или все что тебе нужно).

+0

Большое спасибо за «прочитайте это», помогли много! Об использовании прямых ссылок, не означает ли это, что когда фрагмент будет отсоединен, эти задачи Async не будут собираться мусором? Потому что именно поэтому я использую SoftReference в первую очередь ... Задачи Задачи не так важны. Обычно запрос GET, который должен быть отменен (и я отменю вручную) при отсоединении фрагмента. Кроме того, я только что наткнулся на Google Volley, который должен работать лучше при использовании потоков соединений, поэтому я могу просто перейти на его использование (эти задачи обычно должны загружать контент с сервера) –

+0

См. Мое редактирование, I Я добавил небольшое объяснение об использовании 'AsyncTask' в' Fragment's'. – nKn

+1

спасибо :) Теперь я понимаю еще немного о том, как использовать фрагменты и асинхроны. Заметьте, что я меняю свой код, чтобы использовать Google Volley при работе с интернет-соединениями, но для других вещей я буду реализовывать все. Я оставлю этот вопрос без ответа, если это нормально, на всякий случай, если кто-то захочет ответить на это в будущем (это ссылка на класс, отличный от ссылки на сам Async) –

Смежные вопросы