Android - 每次启动活动时,SwitchCompat OnCheckedChangeListener操作都会运行

时间:2016-05-21 14:46:05

标签: java android switch-statement switchcompat

我的Activity中有一些SwitchCompat,我将OnCheckedChangeListener设置为其中一个但是(使用SharedPreferences),每次启动Activity时,都会执行OnCheckedChangeListener的操作无论它是打开还是关闭(这对于性能非常非常糟糕,因为打开状态操作是运行shell脚本并显示SnackBar,因为它需要一些时间。)< / p>

这是一小段代码......

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显示的活动(应用程序本身),并且运行SwitchCompat的On状态的链接操作。 这会导致在加载Activity时跳过太多帧(在1GB,1.2GHz四分频设备中为430)。有一个以上的Switch,四个或五个。

我该怎么办?我错过了soomething或将代码放在错误的地方?我应该使用OnResume,OnPause等其他方法吗?

1 个答案:

答案 0 :(得分:0)

调用setChecked()以与用户点击相同的方式调用侦听器。

我现在处理设置所有复选框,如下所示:

        play = (SwitchCompat) findViewById(R.id.play_switch);
        play.setOnCheckedChangeListener(null);
        play.setChecked(sharedPrefs.getBoolean("onPlay", false));
        play.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
           ...