如何在RecyclerView倒计时结束后仅调用一次Web服务加载数据?
解决RecyclerView倒计时结束时仅调用一次Web服务的问题
看起来你现在遇到的问题是Adapter里的getAllResturant("")被反复自动调用,而你希望它只在倒计时结束时执行一次对吧?我来帮你梳理下代码里的问题,然后给出具体的修复方案。
问题分析
从你的代码来看,核心问题有两个:
- 当任意一个ViewHolder的倒计时结束时,都会触发
tmr.cancel()和getAllResturant(""),如果有多个item同时结束倒计时,就会导致这个方法被调用多次。 - 没有一个全局标记来控制
getAllResturant的执行次数,只要有item倒计时结束就会触发。
修复方案
我们可以通过添加一个全局标记来确保getAllResturant只执行一次,同时优化Timer和ViewHolder的状态管理:
步骤1:添加全局控制标记
在你的TimerListAdapter类中添加以下变量,用来标记刷新状态并初始化Timer和Handler:
private boolean isDataRefreshed = false; // 标记是否已执行过getAllResturant private Timer tmr = new Timer(); // 确保Timer已初始化 private Handler mHandler = new Handler(Looper.getMainLooper()); // 绑定主线程,避免UI操作异常
步骤2:修改倒计时结束的逻辑
在ResturantDashboardViewHolder的updateTimeRemaining方法中,修改else分支的代码,加入标记判断:
else { // 检查是否已经刷新过数据,确保只调用一次 if (!isDataRefreshed) { isDataRefreshed = true; tmr.cancel(); // 停止全局Timer // 确保在主线程调用getAllResturant(如果涉及UI操作或网络回调) mHandler.post(() -> getAllResturant("")); } // 更新UI为倒计时结束状态 tvMinutes.setText("00"); tvSeconds.setText("00"); }
步骤3:处理Adapter生命周期,避免内存泄漏
添加onDetachedFromRecyclerView方法,在Adapter与RecyclerView解绑时清理Timer和Handler,防止内存泄漏:
@Override public void onDetachedFromRecyclerView(@NonNull RecyclerView recyclerView) { super.onDetachedFromRecyclerView(recyclerView); if (tmr != null) { tmr.cancel(); tmr = null; } mHandler.removeCallbacks(updateRemainingTimeRunnable); }
步骤4:数据更新后重置标记
当你通过getAllResturant获取新数据并更新Adapter时,记得重置isDataRefreshed标记,这样下次倒计时结束时还能正常触发刷新:
private void getAllResturant(String param) { // 你的网络请求逻辑(建议放在子线程执行)... // 请求成功后更新数据 resturantList = newData; notifyDataSetChanged(); isDataRefreshed = false; // 重置标记,允许下次倒计时触发刷新 }
额外优化建议
- 如果你希望每个item的倒计时是独立的(而非全局统一倒计时),应该为每个ViewHolder单独管理倒计时(比如用
CountDownTimer),绑定ViewHolder时启动独立倒计时,回收时取消,同时依然用全局标记确保getAllResturant只执行一次。 - 网络请求
getAllResturant务必放在子线程中执行,避免阻塞主线程,请求完成后再回到主线程更新RecyclerView数据。
内容的提问来源于stack exchange,提问作者Vishal Vaishnav
相关产品推荐
相关产品推荐

