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() {
           ...
Другие вопросы по тегам