与UI线程Android进行通信:用户不活动

时间:2015-01-15 16:33:28

标签: java android multithreading performance android-handler

我有一个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)使用Handlernew Handler(Looper.getMainLooper())实例化getWindow().getDecorView().getHandler()之间的区别是什么?

2)在这种情况下使用System.currentTimeMillis()是安全的吗?

1 个答案:

答案 0 :(得分:3)

1)正如@ corsair992所说,它们应该是等价的,但是我认为拥有自己的Handler实例更可取,因为你明确控制了它。如果您以后需要删除任何待处理的Runnable个实例,则可以removeCallbacksAndRunnables(null);删除Handler发布的所有邮件,而不会影响装饰视图的Handler

2)不要使用System.currentTimeMillis()SystemClock.elapsedRealtime()是一个更好的经过时间的指标,因为它不会受到用户更改日期/时间的影响(而currentTimeMillis() 更改)。