You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio整数变量持久化存储、实时更新及用户提示实现求助

解决计数值实时刷新与添加30分钟返回提示的问题

咱们先搞定计数值无法实时刷新的核心问题,再补上30分钟返回引导的功能,一步步来:

一、实时刷新失效的原因&修复思路

你代码里在onCreate里初始化了final int i,这是应用启动时的初始值,后续每次广告关闭后都是基于这个固定值加1,根本没去读SharedPreferences里的最新存储值——这就是为啥只有重启后才会更新的原因。

解决办法很简单:每次需要更新计数时,都从SharedPreferences里读取最新值,而不是用启动时的固定初始值。

二、添加30分钟返回提示的逻辑

要实现这个功能,得额外存一个用户上次完成广告的时间戳。用户再次点击按钮时,先判断当前时间和上次时间的间隔:如果小于30分钟,就弹出提示引导等待;如果超过30分钟,再执行广告加载和计数逻辑。

修改后的完整代码

public class MainActivity extends AppCompatActivity {
    private InterstitialAd mInterstitialAd;
    private Button watchButton;
    private SharedPreferences sharedpreferences;
    public static final String MyPREFERENCES = "myprefs";
    public static final String COUNT_KEY = "count_key"; // 计数值的存储key
    public static final String LAST_OP_TIME_KEY = "last_op_time"; // 上次操作时间的存储key
    private static final long THIRTY_MINUTES = 30 * 60 * 1000; // 30分钟对应的毫秒数

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

        sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
        watchButton = findViewById(R.id.button_send);
        // 启动时先显示当前的计数值
        updateCountDisplay();

        MobileAds.initialize(this, "ca-app-pub-3940256099942544~3347511713");
        mInterstitialAd = new InterstitialAd(this);
        mInterstitialAd.setAdUnitId("ca-app-pub-02434841XXXXXXXX/XXXXXXXXXX");
        // 提前预加载广告,提升用户点击体验
        loadInterstitialAd();

        watchButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                long currentTime = System.currentTimeMillis();
                long lastOpTime = sharedpreferences.getLong(LAST_OP_TIME_KEY, 0);

                // 判断是否还没到30分钟
                if (currentTime - lastOpTime < THIRTY_MINUTES) {
                    long remainingTime = THIRTY_MINUTES - (currentTime - lastOpTime);
                    int remainMin = (int) (remainingTime / (60 * 1000));
                    int remainSec = (int) ((remainingTime % (60 * 1000)) / 1000);
                    Toast.makeText(MainActivity.this, 
                        String.format("请%d分%d秒后再返回点击按钮哦", remainMin, remainSec), 
                        Toast.LENGTH_LONG).show();
                    return;
                }

                // 广告已加载就显示,否则提示加载中并重新加载
                if(mInterstitialAd.isLoaded()) {
                    mInterstitialAd.show();
                } else {
                    Toast.makeText(MainActivity.this, "广告加载中,请稍等~", Toast.LENGTH_SHORT).show();
                    loadInterstitialAd();
                }
            }
        });

        mInterstitialAd.setAdListener(new AdListener() {
            @Override
            public void onAdClosed() {
                // 读取最新的计数值
                int currentCount = sharedpreferences.getInt(COUNT_KEY, 0);
                currentCount += 1;

                // 更新存储:计数+本次操作时间
                SharedPreferences.Editor editor = sharedpreferences.edit();
                editor.putInt(COUNT_KEY, currentCount);
                editor.putLong(LAST_OP_TIME_KEY, System.currentTimeMillis());
                editor.apply();

                // 实时更新UI显示
                updateCountDisplay();
                // 预加载下一个广告
                loadInterstitialAd();
            }

            @Override
            public void onAdFailedToLoad(int errorCode) {
                // 广告加载失败给用户提示
                Toast.makeText(MainActivity.this, "广告加载失败,请稍后重试", Toast.LENGTH_SHORT).show();
                loadInterstitialAd();
            }
        });
    }

    // 封装广告加载方法,避免重复代码
    private void loadInterstitialAd() {
        mInterstitialAd.loadAd(new AdRequest.Builder().build());
    }

    // 封装计数值显示更新方法,统一处理UI
    private void updateCountDisplay() {
        TextView tv_data = findViewById(R.id.disCount);
        int currentCount = sharedpreferences.getInt(COUNT_KEY, 0);
        tv_data.setText(Integer.toString(currentCount));
    }
}

关键修改点说明

  1. 实时刷新修复:

    • 删掉了onCreate里固定的初始计数值,改为每次需要更新时都从SharedPreferences读取最新值
    • 封装了updateCountDisplay方法,统一处理UI更新,避免重复代码
  2. 30分钟提示功能:

    • 新增LAST_OP_TIME_KEY存储用户上次完成广告的时间戳
    • 按钮点击时先判断时间间隔,不足30分钟就显示剩余等待时间的提示
    • 广告关闭时记录当前时间,作为下次判断的依据
  3. 体验优化:

    • 提前预加载广告,减少用户等待时间
    • 增加广告加载失败的提示,提升用户体验
    • 重复代码封装,让整体结构更清晰

内容的提问来源于stack exchange,提问作者brvnbld

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:42:06