Java 如何暂停/恢复处理程序/可运行?

Java 如何暂停/恢复处理程序/可运行?,java,android,timer,handler,runnable,Java,Android,Timer,Handler,Runnable,我想按下一个按钮,让这个按钮触发一个计时器,每秒增加一个变量。当我关闭应用程序时,我希望它暂停,当应用程序打开时,我希望它从上次的位置恢复。我需要做什么 这是我的密码: public class MainActivity extends ActionBarActivity { public void save(){ Editor editor = pref.edit(); editor.putInt("countertest", counter);

我想按下一个按钮,让这个按钮触发一个计时器,每秒增加一个变量。当我关闭应用程序时,我希望它暂停,当应用程序打开时,我希望它从上次的位置恢复。我需要做什么

这是我的密码:

public class MainActivity extends ActionBarActivity {

    public void save(){
        Editor editor = pref.edit();
        editor.putInt("countertest", counter);
        editor.commit();
    }//end of save


    public void read(){
        counter = pref.getInt("countertest", counter);
    }//end of read


      Handler testHandler = new Handler();
      int counter;
      TextView testView;
      Button testButton;
      Runnable Runnable0;
      SharedPreferences pref;




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        testView = (TextView) findViewById(R.id.testView);
        testButton = (Button) this.findViewById(R.id.testButton);
        pref = PreferenceManager.getDefaultSharedPreferences(this);



      read();
        testView.setText(Integer.toString(counter));




    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }


@Override
protected void onResume() {


    read();


   final Runnable Runnable0 = new Runnable() {
        @Override
        public void run() {
            counter += 1;   
            testView.setText(Integer.toString(counter));
            testHandler.postDelayed(this, 1000);
            save();
            }// end of if   
    };




    /* button click */
    testButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            /* Start runnable */

                testButton.setEnabled(false);
                counter -= 5;
                save();
                testView.setText(Integer.toString(counter));
                testHandler.post(Runnable0);



        }// end of onClick
    });// end of blingButton onClickListener    

    super.onResume();

}//end of onResume

@Override
protected void onPause() {
    save();
    testHandler.removeCallbacks(Runnable0);
    super.onPause();
}//end of onPause
}

您应该将上次调用
Runnable
的时间(可能以毫秒为单位)存储在如下变量中:

int lastRunnableCall = Calendar.getInstance().getTimeInMillis();
int onPauseTime = Calendar.getInstance().getTimeInMillis();
然后在调用
onPause
时将当前时间存储在变量中。大概是这样的:

int lastRunnableCall = Calendar.getInstance().getTimeInMillis();
int onPauseTime = Calendar.getInstance().getTimeInMillis();
在您的
onResume
中,如果存储了on pause time的值,则可以计算出正确的post延迟时间

int postDelayedTime = onPauseTime > 0 ? 1000 - (onPauseTime - lastRunnableCall) : 1000; 

如果不尝试这个,我不知道它会有多准确。但这就是我要开始的地方

我想在哪里存储“int lastRunnableCall=Calendar.getInstance().getTimeInMillis();”?在onCreate?我不明白你的解释,我仍然无法让它工作。很抱歉我的答复晚了
lastRunnableCall
onPauseTime
将是活动的变量。每次调用
run()。您应该深入研究android的生命周期,以进一步了解这一点。它是否假定为
int lastRunnableCall=(int)Calendar.getInstance().getTimeInMillis()使用int类型转换,否则我会得到一个错误。另外,当我按照您所说的做时,变量
onPauseTime
lastRunnableCall
在我的
onResume()
中不会被识别为变量,即使我在您提到的相应位置调用了它们。