类似刷新列表场景,由于多个地方会调用刷新,但是频繁刷新耗性能,其实我们只需要取一定时间内第一次和最后一次进行处理。
以此,封装了一个工具类。
使用步骤示例:
1、初始化
CacheTimeDownTodoHelper cacheTimeDownTodoHelper = new CacheTimeDownTodoHelper(this, 1000, new CacheTimeDownTodoHelper.OnTimeToDoCallBack() {
@Override
public void onTimeToDoCallBack() {
//Do something
}
});
2、刷新时调用
boolean unDelayed = updateUserListCacheTimeDownTodoHelper.cacheTimeDownTodo();
if (unDelayed) {
//Do something
}
附工具类代码:
/**
* <pre>
* 缓存处理事件,用于多次调用一个方法时,我们只需要取一定时间内第一次和最后一次
* </pre>
*/
public class CacheTimeDownTodoHelper {
/**
* 是否已经在延迟处理中
*/
private boolean isDelayed;
private LifecycleOwner lifecycleOwner;
/**
* 上次处理时间
*/
private long lastTodoTime;
private OnTimeToDoCallBack onTimeToDoCallBack;
/**
* 缓存时间
*/
private int timeLimit;
public CacheTimeDownTodoHelper(LifecycleOwner lifecycleOwner, int timeLimit, OnTimeToDoCallBack onTimeToDoCallBack) {
this.lifecycleOwner = lifecycleOwner;
this.timeLimit = timeLimit;
this.onTimeToDoCallBack = onTimeToDoCallBack;
}
public boolean cacheTimeDownTodo() {
if (isDelayed) {
return false;
}
//距离上次刷新在time_limit时间内
if (System.currentTimeMillis() - lastTodoTime < timeLimit) {
isDelayed = true;
tadoTimeDown();
return false;
}
lastTodoTime = System.currentTimeMillis();
return true;
}
private void tadoTimeDown() {
if (lifecycleOwner == null) {
Observable.timer(timeLimit, TimeUnit.MILLISECONDS)
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
tadoTime();
}
});
return;
}
//倒计时处理
Observable.timer(timeLimit, TimeUnit.MILLISECONDS)
//AutoDispose 防止内存泄漏
.as(AutoDispose.autoDisposable(AndroidLifecycleScopeProvider.from(lifecycleOwner)))
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
tadoTime();
}
});
}
private void tadoTime() {
isDelayed = false;
lastTodoTime = System.currentTimeMillis();
if (onTimeToDoCallBack != null) {
onTimeToDoCallBack.onTimeToDoCallBack();
}
}
public interface OnTimeToDoCallBack {
void onTimeToDoCallBack();
}
}