Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何防止新意图上的倒计时重复_Java_Android_Runnable_Countdowntimer - Fatal编程技术网

Java 如何防止新意图上的倒计时重复

Java 如何防止新意图上的倒计时重复,java,android,runnable,countdowntimer,Java,Android,Runnable,Countdowntimer,我对倒计时有问题。我有2个活动,主要和商店。。。在商店里我有一个按钮,如果用户点击按钮,倒计时开始。。如果结束,用户可获得+50硬币。它可以工作,但如果我回到mainactivity,然后再回到store,计时器会重复,用户会得到两倍或三倍的硬币。。。。我修正了一半,但是代码中有一个小错误。。。。 因此,如果我取消对startTimer()的注释;在onResume的storeactivity中,如果我转到mainactivity并返回store,则倒计时重复。。。如果我删除startTimer

我对倒计时有问题。我有2个活动,主要和商店。。。在商店里我有一个按钮,如果用户点击按钮,倒计时开始。。如果结束,用户可获得+50硬币。它可以工作,但如果我回到mainactivity,然后再回到store,计时器会重复,用户会得到两倍或三倍的硬币。。。。我修正了一半,但是代码中有一个小错误。。。。 因此,如果我取消对startTimer()的注释;在onResume的storeactivity中,如果我转到mainactivity并返回store,则倒计时重复。。。如果我删除startTimer();从onResume进入storeactivity,然后倒计时不更新,如果我转到mainactivity并返回store。。。。它可以工作,但不会自动更新计数器文本。。。 在mainactivity中,计时器工作正常,没有任何问题。。。 我如何解决这个问题? 我尝试使用make runnable to updateCountDownText();但它不起作用,也许我写错了代码。 有人能帮我吗? 或者如何使updateCountDownText()能够运行

主要活动:

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");

}

}