Android - действие SwitchCompat OnCheckedChangeListener запускается при каждом запуске действия
У меня есть немного SwitchCompat
в своей деятельности я установил OnCheckedChangeListener
к одному из них, но (используя SharedPreferences
), каждый раз, когда я запускаю Activity, действие OnCheckedChangeListener выполняется независимо от того, включено оно или выключено (что очень сильно сказывается на производительности, поскольку действие состояния On состоит в запуске сценария оболочки и отображении SnackBar
как это займет некоторое время).
Вот небольшой кусочек кода...
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
//Private stuffs...
SwitchCompat play; //and many others
public static final String PREFS_NAME = "SwitchButton";
protected void onCreate(Bundle savedInstanceState) {
// ...
play = (SwitchCompat) findViewById(R.id.play_switch);
play.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
Shell.SU.run("sh /data/data/br.com.packagename/play_on");
Snackbar snack_play_on = Snackbar.make(play, R.string.play_on, Snackbar.LENGTH_SHORT);
snack_play_on.show();
SharedPreferences.Editor editor = getSharedPreferences("SwitchButton", MODE_PRIVATE).edit();
editor.putBoolean("onPlay", true);
editor.apply();
} else {
Shell.SU.run("sh /data/data/br.com.packagename/play_off");
SharedPreferences.Editor editor = getSharedPreferences("SwitchButton", MODE_PRIVATE).edit();
editor.putBoolean("onPlay", false);
editor.apply();
Snackbar snack_play_off = Snackbar.make(play, R.string.play_off, Snackbar.LENGTH_SHORT);
snack_play_off.show();
}
}
});
play.setChecked(sharedPrefs.getBoolean("onPlay", false));
Итак... Каждый раз, когда открывается действие (или само приложение), которое показывает Snackbar, и выполняется связанное действие с состоянием On SwitchCompat. Это приводит к пропуску слишком большого количества кадров при загрузке Activity (около 230 в четырех ГБ 1 ГБ, 1,2 ГГц). Существует более одного переключателя, четыре или пять.
Что я должен делать? Я что-то пропустил или поставил код в неправильном месте? Должен ли я использовать другие методы, такие как OnResume, OnPause и т. Д.?
1 ответ
Призвание setChecked()
вызывает слушателя так же, как и пользователь.
Теперь я занимаюсь настройкой всех флажков следующим образом:
play = (SwitchCompat) findViewById(R.id.play_switch);
play.setOnCheckedChangeListener(null);
play.setChecked(sharedPrefs.getBoolean("onPlay", false));
play.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
...