提问人:Tony 提问时间:11/30/2018 最后编辑:Tony 更新时间:12/8/2018 访问量:135
将 Context 用于不带 MVC 的简单应用的最佳实践
Best Practice for using Context for a simple App without MVC
问:
我是编程新手。我有一个简单的应用程序,只有几个活动,我需要在这些活动中使用 Context。链接:简单应用程序的 MVC 中的 https://openclassrooms.com/en/courses/4661936-develop-your-first-android-application/4679186-learn-the-model-view-controller-pattern 和答案说,简单应用程序不需要 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();
}
});
}
}
答:
在每个 Fragment 中,您可以随心所欲地使用或使用它们。请记住,如果尚未创建 Fragment 的根视图,则两者都是 ,并且将是。一些示例代码: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);
}
}
使用此局部变量与每次使用之间没有性能差异,您只需删除有关上下文为 null 的警告即可。getContext
而且,由于上下文不会暴露在具有 Fragment 或 Activity 之后的生命周期的实体之外(这意味着您不会将上下文提供给在 Fragment 或 Activity 被终止后可能继续存在的任何类实例),因此从此代码中不会有泄漏。
评论
getContext
getContext
mContext
onViewCreated
onCreateView
onViewCreated
评论