Лучшая практика использования контекста для простого приложения без MVC - PullRequest
0 голосов
/ 29 ноября 2018

Я новичок в программировании.У меня есть простое приложение с несколькими действиями, и мне нужно использовать Context в этих действиях.Ссылка: https://openclassrooms.com/en/courses/4661936-develop-your-first-android-application/4679186-learn-the-model-view-controller-pattern и ответ в MVC для простого приложения говорят, что мне не нужен MVC для простого приложения, и я хочу избежать его использования.Что было бы наилучшей практикой для получения контекстов в моем случае?Я думаю static Context может вызвать утечки памяти.Должен ли я просто звонить getContext() каждый раз, когда мне нужен контекст?(Я проверял это, это работает).Он не работает с this, только с getContext().Я думаю, что это потому, что это внутри фрагментов.Спасибо

Для лучшего понимания: это часть того, что у меня есть:

public class MainApplication extends Application 
{
    @Override
    public void onCreate()
    {
        super.onCreate();
        FirstManager.createInstance(getApplicationContext());
    }
}

Я передаю этот контекст с помощью конструктора в FirstManager.Если у меня больше занятий / классов, чем только в FirstManager, лучше будет написать еще раз getApplicationContext() или написать в области видимости что-то вроде: Context context; после onCreate: getContext() и сохранить его в context?

ОБНОВЛЕНИЕ: Это фрагмент (другие фрагменты похожи, ничего особенного):

public class List extends Fragment {
...
private FloatingActionButton fab;
    private FloatingActionButton fdb;
    private RecyclerView recyclerView;
...

    @Override
    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        fab = ( FloatingActionButton ) view.findViewById(R.id.floatingActionButton);
        recyclerView = (RecyclerView) view.findViewById(R.id.RView);
        fdb = ( FloatingActionButton ) view.findViewById(R.id.floatingDeleteButton);


            fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    startActivity(new Intent(getContext(), FloatingButtonActivity.class));
                }
            });
            recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
 DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(getContext(),1);
            recyclerView.addItemDecoration(dividerItemDecoration);
        }
 @Override
        public void onResume() {
            super.onResume();
            final RAdapter radapter = new RAdapter(getContext(),getActivity());
            recyclerView.setAdapter(radapter);

            fdb.hide();
            fdb.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    radapter.deleteSelection();
                }
            });
        }
}

1 Ответ

0 голосов
/ 01 декабря 2018

В каждом фрагменте вы можете использовать getContext или getActivity и использовать их по своему усмотрению.Имейте в виду, что оба значения Nullable, и будут null, если корневое представление фрагмента не было создано.Пример кода:

@Override
public void onViewCreated(View view) {
    ...

    Context context = getContext();
    if (context != null) {
        startActivity(new Intent(context, FloatingButtonActivity.class));
        ...
        recyclerView.setLayoutManager(new LinearLayoutManager(context));
        ...
        DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(context);
    }
}

Нет никакой разницы в производительности между использованием этой локальной переменной и getContext каждый раз, вы просто избавляетесь от предупреждений о нулевом контексте.

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

...