Android - 每次启动 activity 时,SwitchCompat OnCheckedChangeListener 操作都是 运行
Android - SwitchCompat OnCheckedChangeListener action is running every time the activity is started
我的 Activity 中有一些 SwitchCompat
,我将 OnCheckedChangeListener
设置为其中之一,但是(使用 SharedPreferences
),每次我启动 Activity,无论打开还是关闭,都会执行 OnCheckedChangeListener 的操作(这对性能非常非常糟糕,因为 On state 操作是 运行 a shell 脚本并显示 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 显示的 activity(不是应用程序本身),以及 SwitchCompat 运行s 的 On 状态的链接操作。
这会导致在加载 Activity 时跳帧过多(在 1GB、1.2GHz 四核设备中大约为 230)。 Switch不止一台,四台,五台。
我该怎么办?我是否遗漏了什么或将代码放在错误的位置?我应该使用其他方法,如 OnResume、OnPause 等吗?
调用 setChecked()
会以与用户点击相同的方式调用侦听器。
我现在像这样设置所有复选框:
play = (SwitchCompat) findViewById(R.id.play_switch);
play.setOnCheckedChangeListener(null);
play.setChecked(sharedPrefs.getBoolean("onPlay", false));
play.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
...
我的 Activity 中有一些 SwitchCompat
,我将 OnCheckedChangeListener
设置为其中之一,但是(使用 SharedPreferences
),每次我启动 Activity,无论打开还是关闭,都会执行 OnCheckedChangeListener 的操作(这对性能非常非常糟糕,因为 On state 操作是 运行 a shell 脚本并显示 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 显示的 activity(不是应用程序本身),以及 SwitchCompat 运行s 的 On 状态的链接操作。 这会导致在加载 Activity 时跳帧过多(在 1GB、1.2GHz 四核设备中大约为 230)。 Switch不止一台,四台,五台。
我该怎么办?我是否遗漏了什么或将代码放在错误的位置?我应该使用其他方法,如 OnResume、OnPause 等吗?
调用 setChecked()
会以与用户点击相同的方式调用侦听器。
我现在像这样设置所有复选框:
play = (SwitchCompat) findViewById(R.id.play_switch);
play.setOnCheckedChangeListener(null);
play.setChecked(sharedPrefs.getBoolean("onPlay", false));
play.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
...