Java 如何防止新意图上的倒计时重复
我对倒计时有问题。我有2个活动,主要和商店。。。在商店里我有一个按钮,如果用户点击按钮,倒计时开始。。如果结束,用户可获得+50硬币。它可以工作,但如果我回到mainactivity,然后再回到store,计时器会重复,用户会得到两倍或三倍的硬币。。。。我修正了一半,但是代码中有一个小错误。。。。 因此,如果我取消对startTimer()的注释;在onResume的storeactivity中,如果我转到mainactivity并返回store,则倒计时重复。。。如果我删除startTimer();从onResume进入storeactivity,然后倒计时不更新,如果我转到mainactivity并返回store。。。。它可以工作,但不会自动更新计数器文本。。。 在mainactivity中,计时器工作正常,没有任何问题。。。 我如何解决这个问题? 我尝试使用make runnable to updateCountDownText();但它不起作用,也许我写错了代码。 有人能帮我吗? 或者如何使updateCountDownText()能够运行 主要活动:Java 如何防止新意图上的倒计时重复,java,android,runnable,countdowntimer,Java,Android,Runnable,Countdowntimer,我对倒计时有问题。我有2个活动,主要和商店。。。在商店里我有一个按钮,如果用户点击按钮,倒计时开始。。如果结束,用户可获得+50硬币。它可以工作,但如果我回到mainactivity,然后再回到store,计时器会重复,用户会得到两倍或三倍的硬币。。。。我修正了一半,但是代码中有一个小错误。。。。 因此,如果我取消对startTimer()的注释;在onResume的storeactivity中,如果我转到mainactivity并返回store,则倒计时重复。。。如果我删除startTimer
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.Locale;
import static com.game.game.variables.coin;
import static com.game.game.variables.life;
public class MainActivity extends AppCompatActivity {
public static final String PREFS_NAME_MAIN = "mainpref";
private static final long START_TIME_IN_MILLIS = 60000;
public static final String PREFS_NAME_TIME = "timepref";
private TextView mTextViewCountDown;
private CountDownTimer mCountDownTimer;
private boolean mTimerRunning;
private long mTimeLeftInMillis;
private long mEndTime;
TextView coinbarText, lifesbarText;
Button playButton, closeButton;
ImageView lifesbarButton, coinbarButton;
private final Context app = this;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
coinbarText = findViewById(R.id.coinbarText);
lifesbarText = findViewById(R.id.lifesbarText);
playButton = findViewById(R.id.playButton);
closeButton = findViewById(R.id.closeButton);
lifesbarButton = findViewById(R.id.lifesbarButton);
coinbarButton = findViewById(R.id.coinbarButton);
textupgrade();
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//finishAffinity();
startActivity(new Intent(MainActivity.this, ExitActivity.class));
}
});
mTextViewCountDown = findViewById(R.id.text_view_countdown);
}
private void startTimer() {
mEndTime = System.currentTimeMillis() + mTimeLeftInMillis;
mCountDownTimer = new CountDownTimer(mTimeLeftInMillis, 1000) {
@Override
public void onTick(long millisUntilFinished) {
mTimeLeftInMillis = millisUntilFinished;
mTimerRunning = true;
updateCountDownText();
}
@Override
public void onFinish() {
mTimerRunning = false;
load();
coin = coin + 50;
coinbarText.setText("" + coin);
resetTimer();
SharedPreferences prefs = getSharedPreferences("prefs", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putLong("millisLeft", mTimeLeftInMillis);
editor.putBoolean("timerRunning", mTimerRunning);
editor.putLong("endTime", mEndTime);
editor.apply();
save();
}
}.start();
mTimerRunning = true;
}
private void resetTimer() {
mTimeLeftInMillis = START_TIME_IN_MILLIS;
updateCountDownText();
}
private void updateCountDownText() {
int minutes = (int) (mTimeLeftInMillis / 1000) / 60;
int seconds = (int) (mTimeLeftInMillis / 1000) % 60;
String timeLeftFormatted = String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds);
mTextViewCountDown.setText(timeLeftFormatted);
}
public void store (View store){
Intent newstore = new Intent(this, StoreActivity.class);
this.startActivity(newstore);
}
public void exit (View exit){
Intent newexit = new Intent(this, ExitActivity.class);
this.startActivity(newexit);
}
@Override
protected void onStart()
{
super.onStart();
load();
textupgrade();
coinbarText.setText("" + coin);
}
protected void onResume()
{
super.onResume();
load();
//textupgrade();
textupgrade();
SharedPreferences prefs = getSharedPreferences("prefs", MODE_PRIVATE);
mTimeLeftInMillis = prefs.getLong("millisLeft", START_TIME_IN_MILLIS);
mTimerRunning = prefs.getBoolean("timerRunning", false);
updateCountDownText();
if (mTimerRunning) {
mEndTime = prefs.getLong("endTime", 0);
mTimeLeftInMillis = mEndTime - System.currentTimeMillis();
if (mTimeLeftInMillis < 0) {
mTimeLeftInMillis = 0;
mTimerRunning = false;
updateCountDownText();
coin = coin + 50;
resetTimer();
} else {
startTimer();
}
}
coinbarText.setText("" + coin);
}
@Override
protected void onRestart() {
super.onRestart();
load();
textupgrade();
coinbarText.setText("" + coin);
}
protected void onStop()
{
super.onStop();
SharedPreferences prefs = getSharedPreferences("prefs", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putLong("millisLeft", mTimeLeftInMillis);
editor.putBoolean("timerRunning", mTimerRunning);
editor.putLong("endTime", mEndTime);
editor.apply();
if (mCountDownTimer != null) {
mCountDownTimer.cancel();
}
save();
}
private void load()
{
SharedPreferences varReader = app.getSharedPreferences(PREFS_NAME_MAIN, MODE_PRIVATE);
coin = varReader.getInt("coin", 100);
life = varReader.getInt("life", 5);
}
private void save()
{
SharedPreferences.Editor varReader = app.getSharedPreferences(PREFS_NAME_MAIN, 0).edit();
varReader.putInt("coin", coin);
varReader.putInt("life", life);
varReader.apply();
}
private void textupgrade(){
coinbarText.setText(""+coin);
lifesbarText.setText(life + "/5");
}
}
导入androidx.appcompat.app.appcompat活动;
导入android.content.Context;
导入android.content.Intent;
导入android.content.SharedReferences;
导入android.os.Bundle;
导入android.os.CountDownTimer;
导入android.view.view;
导入android.view.WindowManager;
导入android.widget.Button;
导入android.widget.ImageView;
导入android.widget.TextView;
导入android.widget.Toast;
导入java.util.Locale;
导入静态com.game.game.variables.coin;
导入静态com.game.game.variables.life;
公共类MainActivity扩展了AppCompatActivity{
公共静态最终字符串PREFS\u NAME\u MAIN=“mainpref”;
专用静态最终长启动时间单位为60000;
公共静态最终字符串PREFS\u NAME\u TIME=“timepref”;
私有文本视图MTEXTVIEW倒计时;
专用倒数计时器mCountDownTimer;
私有布尔mTimerRunning;
私有长mtimelftinmillis;
私生活时间长;
TextView coinbarText,LifeBarText;
按钮播放按钮,关闭按钮;
ImageView生活按钮,共按钮;
私有最终上下文应用程序=此;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_全屏,WindowManager.LayoutParams.FLAG_全屏);
setContentView(R.layout.activity_main);
coinbarText=findviewbyd(R.id.coinbarText);
lifestbartext=findviewbyd(R.id.lifestbartext);
playButton=findViewById(R.id.playButton);
closeButton=findViewById(R.id.closeButton);
LifeBarButton=findViewById(R.id.LifeBarButton);
coinbarButton=findViewById(R.id.coinbarButton);
textupgrade();
closeButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
//有限性();
startActivity(新意图(MainActivity.this、ExitActivity.class));
}
});
mTextViewCountDown=findviewbyd(R.id.text\u view\u countdown);
}
私有void startTimer(){
mEndTime=System.currentTimeMillis()+mTimeLeftInMillis;
mCountDownTimer=新的倒计时(mtimelftinmillis,1000){
@凌驾
公共void onTick(长毫秒未完成){
mTimeLeftInMillis=毫秒直至完成;
mTimerRunning=真;
updateCountDownText();
}
@凌驾
公共无效onFinish(){
mTimerRunning=假;
加载();
硬币=硬币+50;
coinbarText.setText(“+硬币);
重置计时器();
SharedReferences prefs=GetSharedReferences(“prefs”,模式\私有);
SharedReferences.Editor=prefs.edit();
编辑:putLong(“millisLeft”,mTimeLeftInMillis);
编辑器.putBoolean(“timerRunning”,mTimerRunning);
编辑:putLong(“结束时间”,mEndTime);
editor.apply();
save();
}
}.start();
mTimerRunning=真;
}
私有void resetTimer(){
MTIMELFTINMILLIS=开始时间(单位:毫秒);
updateCountDownText();
}
私有void updateCountDownText(){
int分钟=(int)(mtimelftinmillis/1000)/60;
整数秒=(整数)(mTimeLeftInMillis/1000)%60;
String timeLeftFormatted=String.format(Locale.getDefault(),%02d:%02d),分,秒);
mTextViewCountDown.setText(timeLeftFormatted);
}
公共空存储(视图存储){
Intent newstore=newintent(这个,StoreActivity.class);
这是startActivity(新闻商店);
}
公共无效出口(视图出口){
Intent newexit=newintent(这是exitctivity.class);
这个。startActivity(newexit);
}
@凌驾
受保护的void onStart()
{
super.onStart();
加载();
textupgrade();
coinbarText.setText(“+硬币);
}
受保护的void onResume()
{
super.onResume();
加载();
//textupgrade();
textupgrade();
SharedReferences prefs=GetSharedReferences(“prefs”,模式\私有);
mtimelftinmillis=prefs.getLong(“millisLeft”,以毫秒为单位的开始时间);
mTimerRunning=prefs.getBoolean(“timerRunning”,false);
updateCountDownText();
如果(mTimerRunning){
mEndTime=prefs.getLong(“endTime”,0);
mtimelftinmillis=mEndTime-System.currentTimeMillis();
如果(MTIMELFTINMILLIS<0){
mtimelftinmillis=0;
mTimerRunning=假;
updateCountDownText();
硬币=硬币+50;
重置计时器();
}否则{
startTimer();
}
}
coinbarText.setText(“+硬币);
}
@凌驾
受保护的void onRestart(){
super.onRestart();
加载();
textupgrade();
coinbarText.setText(“+硬币);
}
受保护的void onStop()
{
super.onStop();
SharedReferences prefs=GetSharedReferences(“prefs”,模式\私有);
SharedReferences.Editor=prefs.edit();
编辑:putLong(“millisLeft”,mTimeLeftInMillis);
编辑器.putBoolean(“timerRunning”,mTimerRunning);
编辑:普特隆
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.reward.RewardItem;
import com.google.android.gms.ads.reward.RewardedVideoAd;
import com.google.android.gms.ads.reward.RewardedVideoAdListener;
import java.util.Locale;
import static com.game.game.variables.coin;
import static com.game.game.variables.life;
public class StoreActivity extends AppCompatActivity implements RewardedVideoAdListener {
public static final String PREFS_NAME_MAIN = "mainpref";
private static final long START_TIME_IN_MILLIS = 60000;
public static final String PREFS_NAME_TIME = "timepref";
private TextView mTextViewCountDown;
private CountDownTimer mCountDownTimer;
private boolean mTimerRunning;
private long mTimeLeftInMillis;
private long mEndTime;
private final Context app = this;
Button storecloseButton, coin200, coin500, coin1000, adcoinloading, adcoin, timecoin;
TextView coinbarText, lifesbarText;
ImageView lifesbarButton, coinbarButton;
RewardedVideoAd rewardedVideoAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_store);
storecloseButton = findViewById(R.id.storecloseButton);
lifesbarButton = findViewById(R.id.lifesbarButton);
coinbarButton = findViewById(R.id.coinbarButton);
lifesbarText = findViewById(R.id.lifesbarText);
coinbarText = findViewById(R.id.coinbarText);
coin200 = findViewById(R.id.coin200);
coin500 = findViewById(R.id.coin500);
coin1000 = findViewById(R.id.coin1000);
adcoinloading = findViewById(R.id.adcoinloading);
adcoin = findViewById(R.id.adcoin);
timecoin = findViewById(R.id.timecoin);
rewardedVideoAd = MobileAds.getRewardedVideoAdInstance(this);
rewardedVideoAd.setRewardedVideoAdListener(this);
textupgrade();
if (rewardedVideoAd.isLoaded()){
adcoin.setVisibility(View.VISIBLE);
adcoinloading.setVisibility(View.INVISIBLE);
}
else{
// adcoinloading.setVisibility(View.VISIBLE);
loadAd();
}
adcoin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (rewardedVideoAd.isLoaded()){
SharedPreferences prefs = getSharedPreferences("prefs", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putLong("millisLeft", mTimeLeftInMillis);
editor.putBoolean("timerRunning", mTimerRunning);
editor.putLong("endTime", mEndTime);
editor.apply();
rewardedVideoAd.show();
}
}
});
mTextViewCountDown = findViewById(R.id.text_view_countdown);
timecoin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mTimerRunning) {
//pauseTimer();
} else {
startTimer();
}
}
});
}
private void startTimer() {
mEndTime = System.currentTimeMillis() + mTimeLeftInMillis;
mCountDownTimer = new CountDownTimer(mTimeLeftInMillis, 1000) {
@Override
public void onTick(long millisUntilFinished) {
mTimeLeftInMillis = millisUntilFinished;
mTimerRunning = true;
updateCountDownText();
}
@Override
public void onFinish() {
load();
mTimerRunning = false;
updateButtons();
coin = coin + 50;
coinbarText.setText("" + coin);
resetTimer();
save();
}
}.start();
mTimerRunning = true;
updateButtons();
}
private void pauseTimer() {
mCountDownTimer.cancel();
mTimerRunning = false;
updateButtons();
}
private void resetTimer() {
mTimeLeftInMillis = START_TIME_IN_MILLIS;
updateCountDownText();
updateButtons();
}
private void updateCountDownText() {
int minutes = (int) (mTimeLeftInMillis / 1000) / 60;
int seconds = (int) (mTimeLeftInMillis / 1000) % 60;
String timeLeftFormatted = String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds);
mTextViewCountDown.setText(timeLeftFormatted);
}
private void updateButtons() {
if (mTimerRunning) {
//mButtonReset.setVisibility(View.INVISIBLE);
timecoin.setVisibility(View.INVISIBLE);
} else {
//mButtonStartPause.setText("Start");
if (mTimeLeftInMillis < 1000) {
timecoin.setVisibility(View.INVISIBLE);
} else {
timecoin.setVisibility(View.VISIBLE);
}
if (mTimeLeftInMillis < START_TIME_IN_MILLIS) {
//mButtonReset.setVisibility(View.VISIBLE);
} else {
//mButtonReset.setVisibility(View.INVISIBLE);
}
}
}
public void storeback (View storeback){
SharedPreferences prefs = getSharedPreferences("prefs", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putLong("millisLeft", mTimeLeftInMillis);
editor.putBoolean("timerRunning", mTimerRunning);
editor.putLong("endTime", mEndTime);
editor.apply();
if (mCountDownTimer != null) {
mCountDownTimer.cancel();
}
save();
finish();
}
private void loadAd() {
if (!rewardedVideoAd.isLoaded()){
rewardedVideoAd = null;
rewardedVideoAd = MobileAds.getRewardedVideoAdInstance(this);
rewardedVideoAd.setRewardedVideoAdListener(this);
rewardedVideoAd.loadAd("ca-app-pub-3940256099942544/5224354917",new AdRequest.Builder().build());
}
}
@Override
public void onRewardedVideoAdLoaded() {
adcoin.setVisibility(View.VISIBLE);
adcoinloading.setVisibility(View.INVISIBLE);
}
@Override
public void onRewardedVideoAdOpened() {
}
@Override
public void onRewardedVideoStarted() {
SharedPreferences prefs = getSharedPreferences("prefs", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putLong("millisLeft", mTimeLeftInMillis);
editor.putBoolean("timerRunning", mTimerRunning);
editor.putLong("endTime", mEndTime);
editor.apply();
}
@Override
public void onRewardedVideoAdClosed() {
loadAd();
adcoin.setVisibility(View.INVISIBLE);
adcoinloading.setVisibility(View.VISIBLE);
SharedPreferences prefs = getSharedPreferences("prefs", MODE_PRIVATE);
mTimeLeftInMillis = prefs.getLong("millisLeft", START_TIME_IN_MILLIS);
mTimerRunning = prefs.getBoolean("timerRunning", false);
updateCountDownText();
updateButtons();
if (mTimerRunning) {
mEndTime = prefs.getLong("endTime", 0);
mTimeLeftInMillis = mEndTime - System.currentTimeMillis();
if (mTimeLeftInMillis < 0) {
mTimeLeftInMillis = 0;
mTimerRunning = false;
updateCountDownText();
updateButtons();
//coin = coin + 50;
resetTimer();
timecoin.setVisibility(View.VISIBLE);
} else {
//startTimer();
updateCountDownText();
}
}
}
@Override
public void onRewarded(RewardItem rewardItem) {
load();
coin = coin + 50;
save();
textupgrade();
}
@Override
public void onRewardedVideoAdLeftApplication() {
}
@Override
public void onRewardedVideoAdFailedToLoad(int i) {
}
@Override
public void onRewardedVideoCompleted() {
}
@Override
protected void onPause() {
super.onPause();
rewardedVideoAd.pause(this);
save();
}
@Override
protected void onResume() {
super.onResume();
loadAd();
load();
textupgrade();
SharedPreferences prefs = getSharedPreferences("prefs", MODE_PRIVATE);
mTimeLeftInMillis = prefs.getLong("millisLeft", START_TIME_IN_MILLIS);
mTimerRunning = prefs.getBoolean("timerRunning", false);
updateCountDownText();
updateButtons();
if (mTimerRunning) {
mEndTime = prefs.getLong("endTime", 0);
mTimeLeftInMillis = mEndTime - System.currentTimeMillis();
if (mTimeLeftInMillis < 0) {
mTimeLeftInMillis = 0;
mTimerRunning = false;
updateCountDownText();
updateButtons();
coin = coin + 50;
resetTimer();
timecoin.setVisibility(View.VISIBLE);
} else {
//startTimer();
updateCountDownText();
}
}
coinbarText.setText("" + coin);
}
@Override
protected void onRestart() {
super.onRestart();
loadAd();
load();
textupgrade();
coinbarText.setText("" + coin);
}
@Override
protected void onDestroy() {
//rewardedVideoAd.destroy(this);
super.onDestroy();
}
@Override
protected void onStart() {
super.onStart();
loadAd();
load();
textupgrade();
coinbarText.setText("" + coin);
}
@Override
protected void onStop()
{
super.onStop();
SharedPreferences prefs = getSharedPreferences("prefs", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putLong("millisLeft", mTimeLeftInMillis);
editor.putBoolean("timerRunning", mTimerRunning);
editor.putLong("endTime", mEndTime);
editor.apply();
if (mCountDownTimer != null) {
mCountDownTimer.cancel();
}
save();
}
private void load()
{
SharedPreferences varReader = app.getSharedPreferences(PREFS_NAME_MAIN, MODE_PRIVATE);
coin = varReader.getInt("coin", 100);
life = varReader.getInt("life", 5);
}
private void save()
{
SharedPreferences.Editor varReader = app.getSharedPreferences(PREFS_NAME_MAIN, 0).edit();
varReader.putInt("coin", coin);
varReader.putInt("life", life);
varReader.apply();
}
private void textupgrade(){
coinbarText.setText(""+ coin);
lifesbarText.setText(life + "/5");
}
}