将 Context 用于不带 MVC 的简单应用的最佳实践

Best Practice for using Context for a simple App without MVC

提问人:Tony 提问时间:11/30/2018 最后编辑:Tony 更新时间:12/8/2018 访问量:135

问:

我是编程新手。我有一个简单的应用程序,只有几个活动,我需要在这些活动中使用 Context。链接:简单应用程序的 MVC 中的 https://openclassrooms.com/en/courses/4661936-develop-your-first-android-application/4679186-learn-the-model-view-controller-pattern 和答案说,简单应用程序不需要 MVC,我想避免使用它。在我的案例中获取上下文的最佳实践是什么?我认为可能会导致内存泄漏。我应该在每次需要上下文时都打电话吗?(我测试了它,它有效)。它不适用于 ,只能与 一起使用。我认为这是因为它在碎片内部。谢谢static ContextgetContext()thisgetContext()

为了更好地理解:这是我所拥有的一部分:

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

我在构造函数的帮助下将此上下文传递给 FirstManager。如果我的活动/类比 FirstManager 多,那么最好再写一次还是在类范围内写类似: 之后 : 并将其保存到 ?getApplicationContext()Context context;onCreategetContext()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();
                }
            });
        }
}
android model-view-controller 这个 android-context

评论

0赞 iFanie 11/30/2018
切勿使用静态上下文。从不。现在,你问什么取决于你需要做什么。 Activity、Views 和 Fragment 都有上下文,因此请提供更多细节。
0赞 iFanie 12/1/2018
听起来像是很好的做法,但请具体向我解释您需要对上下文做什么。

答:

1赞 iFanie 12/1/2018 #1

在每个 Fragment 中,您可以随心所欲地使用或使用它们。请记住,如果尚未创建 Fragment 的根视图,则两者都是 ,并且将是。一些示例代码:getContextgetActivityNullablenull

@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);
    }
}

使用此局部变量与每次使用之间没有性能差异,您只需删除有关上下文为 null 的警告即可。getContext

而且,由于上下文不会暴露在具有 Fragment 或 Activity 之后的生命周期的实体之外(这意味着您不会将上下文提供给在 Fragment 或 Activity 被终止后可能继续存在的任何类实例),因此从此代码中不会有泄漏。

评论

0赞 Tony 12/2/2018
我希望我理解正确:如果我需要片段的上下文两次或更多次,最好在类范围内创建片段的上下文(名称:mContext)。之后,我可以在此片段中第一次需要时调用它。在那之后,每次我在这个片段中需要上下文时,我都会使用“mContext”。在这种情况下,性能更好,因为设备不必对每个片段执行多次操作?getContextgetContext
0赞 Tony 12/2/2018
怎么会没有创建 Fragment 的根视图呢?
1赞 iFanie 12/2/2018
@Tony根据需要调用getContext,我什至不会将其分配给像这样的变量。如果你正在编写 Kotling 代码,它将作为一个属性工作,你甚至不会考虑它。如果您创建了 Fragment 但未将其附加到 Activity,则根视图可能不存在。mContext
0赞 Tony 12/2/2018
谢谢,我希望最后一个问题:在你描述的情况下我该怎么办?
0赞 iFanie 12/3/2018
@Tony Fragment 文档指示您执行与覆盖中的视图相关的任何操作。在那里,你确定你有一个根视图(和一个上下文)。如果这适用于您,我将首先将任何此类登录名从 移动到 。如果有什么特定的事情困扰着你,请分享代码,我很乐意提供帮助。onViewCreatedonCreateViewonViewCreated