【发布时间】:2020-07-16 05:36:09
【问题描述】:
我有一个带有许多按钮的片段。 有些按钮是唯一的,但许多按钮做同样的事情,它为片段事务设置一个 onClickListener。
代码如下所示:
private Button mSetPresetBtn;
private Button mGeneralBtn;
private Button mSecurityBtn;
[...]
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initViews();
setOnClickListeners();
}
private void initViews() {
mSetPresetBtn = requireView().findViewById(R.id.btn_set_preset);
mGeneralBtn = requireView().findViewById(R.id.btn_open_general);
mSecurityBtn = requireView().findViewById(R.id.btn_open_security);
[...]
}
private void setOnClickListeners() {
mSetPresetBtn.setOnClickListener(v -> {
DialogPresetSelection presetSelectionDialog = new DialogPresetSelection();
presetSelectionDialog.show(Objects.requireNonNull(getFragmentManager()), "DialogPresetSelection");
});
mGeneralBtn.setOnClickListener(v -> {
FragmentTransaction transaction = Objects.requireNonNull(getFragmentManager()).beginTransaction();
FragmentSettingsGeneral fragment = new FragmentSettingsGeneral();
transaction.replace(R.id.fl_settings_detail, fragment, "FragmentSettingsGeneral");
transaction.addToBackStack(null);
transaction.commit();
});
mSecurityBtn.setOnClickListener(v -> {
FragmentTransaction transaction = Objects.requireNonNull(getFragmentManager()).beginTransaction();
FragmentSettingsSecurity fragment = new FragmentSettingsSecurity();
transaction.replace(R.id.fl_settings_detail, fragment, "FragmentSettingsSecurity");
transaction.addToBackStack(null);
transaction.commit();
});
[...]
}
我有很多这样的按钮,并且想减少冗余代码。 所以我改变了上面的方法,为相关的按钮和片段创建了一个对列表。
新代码如下所示:
private Button mSetPresetBtn;
private Button mGeneralBtn;
private Button mSecurityBtn;
[...]
private List<Pair<Button, FragmentSettingsBase>> mBtnFragmentPairs = new ArrayList<>();
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initViews();
createBtnFragmentPairs();
setOnClickListeners();
}
private void initViews() {
mSetPresetBtn = requireView().findViewById(R.id.btn_set_preset);
mGeneralBtn = requireView().findViewById(R.id.btn_open_general);
mSecurityBtn = requireView().findViewById(R.id.btn_open_security);
[...]
}
private void createBtnFragmentPairs() {
mBtnFragmentPairs.add(new Pair<>(mGeneralBtn, new FragmentSettingsGeneral()));
mBtnFragmentPairs.add(new Pair<>(mSecurityBtn, new FragmentSettingsSecurity()));
[...]
}
private void setOnClickListeners() {
mSetPresetBtn.setOnClickListener(v -> {
DialogPresetSelection presetSelectionDialog = new DialogPresetSelection();
presetSelectionDialog.show(Objects.requireNonNull(getFragmentManager()), "DialogPresetSelection");
});
[...]
for (Pair<Button, FragmentSettingsBase> pair : mBtnFragmentPairs) {
Button button = Objects.requireNonNull(pair.first);
FragmentSettingsBase fragment = Objects.requireNonNull(pair.second);
setOnClickListenerForFragmentTransaction(button, fragment);
}
}
private void setOnClickListenerForFragmentTransaction(Button button, FragmentSettingsBase fragment) {
button.setOnClickListener(v -> {
FragmentTransaction transaction = Objects.requireNonNull(getFragmentManager()).beginTransaction();
transaction.replace(R.id.fl_settings_detail, fragment, fragment.getClass().getSimpleName());
transaction.addToBackStack(null);
transaction.commit();
});
}
在功能方面,它似乎工作正常。但是,片段事务的性能似乎变得慢得多。 如果在生命周期的onActivityCreated()部分设置了onClickListeners,并且每个按钮都是基础Fragment的成员变量,那么我无法想象为什么会出现性能下降。
是什么导致性能下降? 如何在不损失性能的情况下删除冗余代码?
【问题讨论】:
标签: android performance onclicklistener android-lifecycle fragmenttransaction