2015-04-28 36 views
1

我想按下一个按钮,并让该按钮触发一个定时器,每秒增加一个变量。当我关闭应用程序时,我希望增加的时间暂停,当应用程序打开时,我希望它从最后的位置恢复。我需要做什么?如何暂停/恢复处理程序/可运行?

这里是我的代码:

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 
} 

回答

0

,可以储存最后一次你Runnable接到电话(大概在millseconds)在一个变量是这样的:

int lastRunnableCall = Calendar.getInstance().getTimeInMillis(); 

然后存储当前时间在调用时发生变量。事情是这样的:

int onPauseTime = Calendar.getInstance().getTimeInMillis(); 

在你onResume,如果您有储存在暂停时间就可以制定出正确的延迟后时间的值。

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

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

+0

我想在哪里存储“int lastRunnableCall = Calendar.getInstance()。getTimeInMillis();”?在onCreate? – Justin

+0

我不明白你的解释,我仍然无法完成它的工作。 – Justin

+0

对不起,我迟到的回复。 'lastRunnableCall'和'onPauseTime'是你活动的变量。每次调用run()'方法时,您都会设置'lastRunnableCall',并且在调用'onPause()'时设置'onPauseTime'。 – Dreagen