我有一个Android应用程序,通过Handler
验证用户是否处于不活动状态。但我想知道我的Handler
实现是否是我案例中的最佳解决方案。
代码:
public abstract class UserInteractionControlActivity extends Activity {
private static final int SESSION_TIME_OUT = 300000;
private static final int SESSION_DELAY_TIME = 60000;
private final Handler mHandler = new Handler(Looper.getMainLooper());
private long mLastUserInterationTime;
protected void onResume() {
super.onResume();
mHandler.postDelayed(new UserInteractionControl(), SESSION_TIME_OUT);
Log.i("LOG_KEY", "HANDLER FIRST POST!");
}
public void onUserInteraction() {
super.onUserInteraction();
mLastUserInterationTime = System.currentTimeMillis();
}
private final class UserInteractionControl implements Runnable {
public void run() {
long currentTime = System.currentTimeMillis();
long inactiveTime = currentTime - mLastUserInterationTime;
if (inactiveTime > SESSION_TIME_OUT) {
Log.i("LOG_KEY", "TIME OUT!");
} else {
mHandler.postDelayed(new UserInteractionControl(), SESSION_DELAY_TIME);
Log.i("LOG_KEY", "HANDLER POST AGAIN!");
}
}
}
}
我的主要问题是:
1)使用Handler
和new Handler(Looper.getMainLooper())
实例化getWindow().getDecorView().getHandler()
之间的区别是什么?
2)在这种情况下使用System.currentTimeMillis()
是安全的吗?
答案 0 :(得分:3)
1)正如@ corsair992所说,它们应该是等价的,但是我认为拥有自己的Handler
实例更可取,因为你明确控制了它。如果您以后需要删除任何待处理的Runnable
个实例,则可以removeCallbacksAndRunnables(null);
删除Handler
发布的所有邮件,而不会影响装饰视图的Handler
。
2)不要使用System.currentTimeMillis()
。 SystemClock.elapsedRealtime()
是一个更好的经过时间的指标,因为它不会受到用户更改日期/时间的影响(而currentTimeMillis()
更改)。