我有一个应用程序,它使用一个处理程序从一个片段内部每1秒运行一次postDelayed任务,该处理程序使用复选框启用/禁用。 (工作正常)
当应用程序暂停时,可运行对象仍会在后台按我希望的方式起作用。但是,如果我恢复应用程序,则希望能够在使用handler.removeCallbacks(runnable)取消选中CheckBox的情况下停止处理程序,但会收到NullPointerException。
有没有办法做到这一点?
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(checkBox1.isChecked()) {
if(deviceStart()==0) {
//Failed to start service
checkBox1.setChecked(false);
Toast.makeText(getActivity(), "Failed to Start Service. Please Try Again...",Toast.LENGTH_SHORT).show();
} else {
handler = new Handler();
handler.postDelayed(runnable, 1000);
}
} else {
if(pocketHaloStop()==0) {
//Failed to stop service
checkBox1.setChecked(true);
Toast.makeText(getActivity(), "Failed to Stop Service. Please Try Again...",Toast.LENGTH_SHORT).show();
} else {
handler.removeCallbacks(runnable); //This generates Null Pointer Exception if app is Resumed!
}
}
});
这是Runnable和onPause / onResume的代码:
private Runnable runnable = new Runnable() {
@Override
public void run() {
/* do what you need to do */
handler.postDelayed(this, 1000);
}
};
private void save(final boolean isChecked) {
mContext = getActivity();
SharedPreferences settings = mContext.getSharedPreferences("settings", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("Check", isChecked);
editor.commit();
}
private boolean load() {
mContext = getActivity();
SharedPreferences settings = mContext.getSharedPreferences("settings", Context.MODE_PRIVATE);
return settings.getBoolean("Check", false);
}
@Override
public void onResume() {
super.onResume();
checkBox1 = (CheckBox)view.findViewById(R.id.checkEnable);
checkBox1.setChecked(load());
}
@Override
public void onPause() {
super.onPause();
save(checkBox1.isChecked());
checkBox1.setOnClickListener(null);
}
最佳答案
将处理程序的创建移至onCreate()。
....
public void onCreate(Bundle savedInstanceState) {
...
handler = new Handler();
...
}