我有一个应用程序,它使用一个处理程序从一个片段内部每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();

     ...
 }

07-28 01:35
查看更多