Задать вопрос
dalv_happy
@dalv_happy

Как устранить утечку памяти при замене фрагментов?

Есть боковая шторка с меню. При нажатии на меню фрагмент с контентом меняется на другой. Ссылки на фрагменты не где не храню, при смене каждый раз создаю новый. При первых пару переключений все происходит как и задумано. Старый фрагмент удаляется сборщиком, а новый встает вместо него. То есть с памятью происходит что типо того, занято 28мб затем заменяю фрагмент, падает до 19 затем возрастает до тех же 28. Но после того как немного попереключаться по пунктам меню память перестает освобождаться и переключаясь между двумя пунктами оператива взлетает до 100мб а то и больше.
Код смены фрагментов и самого фрагмента ниже
private fun showEventBoard() {
        setTitle(R.string.event_board)
        supportFragmentManager.beginTransaction()
                .replace(R.id.main_content, MainEventBoardFragment(), EVENT_BOARD_FRAGMENT_TAG)
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                .commit()
    }

    private fun showFavoriteEventBoard() {
        setTitle(R.string.favorites)
        supportFragmentManager.beginTransaction()
                .replace(R.id.main_content, FavoriteEventBoardFragment(), FAVORITE_EVENT_BOARD_FRAGMENT_TAG)
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                .commit()
    }

abstract class EventBoardFragment : Fragment(), SubscriberChangesFavorite<EventInfo> {

    protected var createFilter = false
    protected var eventBoardView: EventBoardView? = null
    protected var filterBlock: FilterEventBoard? = null
    protected var adapter: AdapterEventBoard? = null
    protected var loaderEvents: LoaderEvents? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (eventBoardView != null)
            return
        adapter = AdapterEventBoard(ControllerBehaviorEventViewHolder(this))
        loaderEvents?.loadAllEvents { events ->
            if (events != null)
                for (e in events)
                    adapter?.addItem(e)
        }
    }

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        if (eventBoardView != null)
            return eventBoardView?.rootView
        val root = inflater?.inflate(R.layout.event_board, container, false)
        eventBoardView = EventBoardView(root!!)
        eventBoardView?.setRecyclerViewAdapter(adapter!!)
        if (createFilter) {
            filterBlock = createFilter()
            val v = filterBlock?.getView()
            if (v != null)
                eventBoardView?.addDynamicElement(v)
        }
        setHasOptionsMenu(true)
        return root
    }

    override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
        if (createFilter)
            inflater?.inflate(R.menu.menu_main_activity, menu)
        super.onCreateOptionsMenu(menu, inflater)
    }

    override fun onOptionsItemSelected(item: MenuItem?): Boolean {
        if (item?.itemId == R.id.filter) {
            if ((filterBlock?.showFilter ?: false))
                filterBlock?.hideFilterDialog()
            else
                filterBlock?.showFilterDialog(DataManager.getInstance().userData.filterInfo)
        }
        return super.onOptionsItemSelected(item)
    }

    protected abstract fun createFilter(): FilterEventBoard
}
  • Вопрос задан
  • 427 просмотров
Подписаться 4 Оценить 9 комментариев
Пригласить эксперта
Ответы на вопрос 2
@alaershov
Android-developer
Добейтесь состояния, когда память, как вы думаете, утекла. Пару раз запустите сборщик мусора, для верности. Если памяти всё ещё занято неадекватно много - сделайте дамп памяти. Потом воспользуйтесь анализатором дампов, например, Memory Analyzer Tool от Eclipse, и там будет видно, какие объекты занимают память, и почемеу они не удалены сборщиком мусора.
Ответ написан
Комментировать
FirsofMaxim
@FirsofMaxim
android, java, kotlin developer
Посмотрите может быть здесь ссылки остаются:
protected var createFilter = false
    protected var eventBoardView: EventBoardView? = null
    protected var filterBlock: FilterEventBoard? = null
    protected var adapter: AdapterEventBoard? = null
    protected var loaderEvents: LoaderEvents? = null
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы