睡在onTouchEvent块onSensorChanged

时间:2010-11-13 09:47:41

标签: android multithreading listener accelerometer sensor

我正在制作一个既能利用touchevents又能利用感官的应用程序。 touchevents的问题在于它们经常发射,从而消耗大量的CPU时间。常见的解决方案是使用Thread.sleep使其冷却。

但是,如果想在同一个活动中同时使用onTouchEvent和onSensorChanged,那么应用Thread.sleep hack也会减慢onSensorChanged。这显然是由从同一个(ui)线程调用的两个方法引起的。

是否有某种方法可以从与ui不同的线程调用onTouchEvent,因此可以在不减慢onSensorChanged的情况下执行Thread.sleep技巧?

1 个答案:

答案 0 :(得分:0)

“常见的解决方案是使用Thread.sleep使其冷却。”

你在哪里听到的?睡在主线程(也称为EDT - 事件调度线程)上是不可接受的。 Android正在重绘屏幕并在此线程上执行各种任务。睡觉它可以使它反应迟钝,恕我直言是一种不好的做法。

如果onTouchEvent()过于频繁地触发,那么只需在代码中过滤它们=如果自上次事件以来至少没有超过X时间,则不执行任何操作。

long lastTime = 0; // field in you class holding event handler

// inside your onTouchEvent handler
if(System.getCurrentTimeMillis() - lastTime < XXX)
    return;
 lastTime = System.getCurrentTimeMillis();