Увеличение производительности во вложенных фрагментах и ​​комнате - PullRequest
0 голосов
/ 28 сентября 2018

Я делаю приложение для Android, это изображение, что у меня сейчас:

enter image description here

Так что у меня есть MainActivity, с FrameLayout и Toolbar.(в некоторых фрагментах мне нужно скрыть панель инструментов, в некоторых изменить ее имя)

В MainActivity у меня есть FrameLayout.

Приложение работает так: у меня есть сервер, на котором я получаю данные.Я сделал репозиторий + viewmodel + aliveata (как в google codelabs) и использовал socket.io для соединения с сервером.

Например, у меня есть 2 фрагмента, чтобы показать некоторую информацию, и как это работает:

Сначала пользователь попадает в FragmentMain (код ниже):

Метод в MainActivity для setFragments

protected void setFragment(Fragment fragment) {
    FragmentTransaction t = getSupportFragmentManager().beginTransaction();
    t.replace(R.id.fragment_placeholder, fragment);
    t.commit();
}

также я использую этот код для связи с базой данных и отображения фактических данных пользователю через советы Google (я имею в виду архитектурные компоненты)

, поэтому в onCreate я звоню

 appUpdateViewModel = ViewModelProviders.of(this).get(AppUpdateViewModel.class);

 fragmentMain = new FragmentMain();

 setFragment(fragmentMain);

во FragmentMain. Я делаю следующие шаги, чтобы показать вложенный фрагмент (компоненты или систему

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    ...
    ((MainActivityPfff)getActivity()).setTextTabBar(getString(R.string.fragment_main_toolbar));

    ViewPager viewPager = view.findViewById(R.id.viewPager);
    viewPager.setAdapter(new AdapterPagerMain(getActivity(),getFragmentManager()));
    ...
}

Этот код для AdapterPagerMain

@Override
public Fragment getItem(int position) {
    if (position == 0) {
        return new FragmentComponents();
    } else if (position == 1) {
        return new SystemFragment();
    } else {
        return new SystemFragment(); //notUsing
    }
}

И этот код для FragmentComponents (структура ComponentsFragment такая же, но показывает другие данные)

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    ...
    appUpdateViewModel = ViewModelProviders.of(this).get(AppUpdateViewModel.class);
    appUpdateViewModel.getAllAppUpdates().observe(this, new Observer<List<AppUpdate>>() {
        @Override
        public void onChanged(@Nullable List<AppUpdate> appUpdates) {
            adapterUpdates.setUpdates(appUpdates);
        }
    });
    ...
}

Когда я показываю FragmentMain, я могу нажать на кнопку и перейти к новому фрагменту (например, FragmentAboutApp), поэтому я делаю это так:

@Override
        public void onClick(View view) {
            ((MainActivity)getActivity()).setFragment(new FragmentAboutApp());
        }

Итак, первая проблема, которую я получаю - это когда я нажимаю на кнопку во FragmentAboutApp, которая показывает FragmentMain, я получаю FragmentMain, но без всякого контекстаnt (во FragmentComponents и FragmentSystem у меня есть recyclerViews, получающий информацию из базы данных)

Также я не знаю, является ли правильный способ получения фактических данных (я имею в виду создание новых appViewModels во всех фрагментах и ​​наблюдение за данными).Меня интересует утечка памяти

А также мне интересно использовать вложенные фрагменты.Должен ли я воссоздать это или нет?Мне нужно увеличить производительность до максимального уровня.Или, может быть, мне нужно удалить старый экземпляр фрагментов при переходе на новый?(Пожалуйста, покажите код, как я могу это сделать)

Последний вопрос - я загружаю с сервера большой json-файл с некоторой информацией:

-различные части этой информации, которые я использую в разных фрагментах(но я загружаю только один файл)

Итак, теперь я подключаюсь к серверу в MainActivity и получаю фактический JSON в жизненном цикле MainActivity.Фрагменты просто наблюдают за этой базой данных, а затем она меняется, показывая фактическую информацию

Спасибо!

...