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)); } }
关键修改点说明
实时刷新修复:
- 删掉了
onCreate里固定的初始计数值,改为每次需要更新时都从SharedPreferences读取最新值 - 封装了
updateCountDisplay方法,统一处理UI更新,避免重复代码
- 删掉了
30分钟提示功能:
- 新增
LAST_OP_TIME_KEY存储用户上次完成广告的时间戳 - 按钮点击时先判断时间间隔,不足30分钟就显示剩余等待时间的提示
- 广告关闭时记录当前时间,作为下次判断的依据
- 新增
体验优化:
- 提前预加载广告,减少用户等待时间
- 增加广告加载失败的提示,提升用户体验
- 重复代码封装,让整体结构更清晰
内容的提问来源于stack exchange,提问作者brvnbld
相关产品推荐
相关产品推荐

