Я создаю приложение с экранами, которые представляют данные пользователю. Каждый Screen
имеет свои собственные данные и свой собственный макет, поэтому у него есть метод для возврата int
, который представляет макет, который используется для его расширения, затем этот View
передается функции для поиска конкретных представлений и заполнения их данными.
Жизненный цикл выглядит следующим образом: MainPresenter:
screen.getNextScreen ->
screen.getLayout ->
view = inflateScreen ->
screen.populateScreen(view) ->
(wait for time elappsed or click) -> repeat
Эти Screens
также нужны в SettingsActivity
для их включения \ отключения.
Итак, я создал синглтон ScreenProvider
, он инициализируется один раз, а затем возвращает список.
public class ScreenProvider {
private List<Screen> screens;
private static ScreenProvider instance = new ScreenProvider();
public static ScreenProvider getInstance(){
return instance;
}
private ScreenProvider() {
screens = new ArrayList<>();
screens.add(new Welcome());
screens.add(new CompoundScreen());
screens.add(new Times());
screens.add(new Messages());
screens.add(new Weekly());
}
public List<Screen> getScreenList() {
return Lists.newArrayList(screens);
}
}
Дело в том, что при длительной работе приложение вылетает или закрывается из-за утечек памяти, поэтому я добавил утечку, и это пример для его отчета:
MainActivity has leaked:
D: * static ScreenProvider.!(instance)!
D: * ↳ ScreenProvider.!(screens)!
D: * ↳ ArrayList.!(array)!
D: * ↳ array Object[].!([0])!
D: * ↳ CompoundScreen.!(disposable)!
D: * ↳ LambdaObserver.!(onNext)!
D: * ↳ -$$Lambda$Screen$67KdQ1jl3VSjSvoRred5JqLGY5Q.!(f$1)!
D: * ↳ AppCompatTextView.mContext
D: * ↳ MainActivity
Это всего лишь единичный пример, но почти на каждом экране есть такая утечка. Отчет LeakCanary показывает, что TextView имеет это: D: | mAttachInfo = null
, поэтому я предполагаю, что это не проблема. Также каждый Screen
имеет onHide()
для очистки одноразового использования, который вызывается, когда текущий Screen
скрывается и находится в MainActivity.onStop()
.
Как исправить эту утечку? Не стоит ли использовать синглтон для экранов? Если нет, как мне получить доступ к списку экранов из других действий?
** Редактирование ** Добавление некоторых Screen
основных методов, которые отменяются на каждом экране.
public abstract int getLayout();
public boolean shouldShow()
public void populateData(View view)
public void onHide()
public abstract int getScreenIndex();
public boolean shouldCacheView()
public int getDuration()
Activity
с одним FrameLayout, который присоединяет представление, удаляет его и присоединяет еще один. В MainPresenter представление увеличено. Я думал, что когда представление будет удалено, оно будет собрано мусором, за исключением тех, которые я помечу как кешированные. @FcoP. Это обертка. У него есть метод, который получает представление и заполняет его данными. Я буду редактировать, чтобы добавитьScreen
код smaple. - person SnapDragon   schedule 18.04.2019Fragment
излишне сложный жизненный цикл. - person SnapDragon   schedule 18.04.2019every Screen has an onHide() to clear disposables
, но я предполагаю, что вы очищаете одноразовые предметы неправильно или, возможно, не сохраняете их / не добавляете в составные одноразовые. Можете ли вы показать сделанные вами подписки вCompoundScreen
? - person wasyl   schedule 20.04.2019