本文实例讲述了Android使用Sensor感应器实现线程中刷新UI创建android测力计的功能。分享给大家供大家参考,具体如下:

前面一篇《Android基于Sensor感应器获取重力感应加速度的方法》我们介绍了sensor的基本知识以及一个使用其中加速度感应器获取数据的例子。

前面提到过一个问题,就是说感应器刷新频率太快,假如我们要做一个UI中,需要根据方向数据绘制一个一个移动的箭头,那么就要太过频繁的刷新绘制界面,占用很多的资源,体验性也会很差,《android 2高级编程》中一个演示测力器的例子,却无意中给我们提供了一种此情况下刷新UI的解决方案,这下我们就知道了如何防止感应器在界面中过于频繁的刷新。

下面是自己修改的代码,供大家参考

/*  * @author octobershiner  * 2011 07 27  * SE.HIT  * 这是《Android 2 高级编程》中的一个实例,关于感应器的使用很普通,但是介绍了一种使用感应器的应用如何刷新UI的好办法,值得学习  * 我添加了一些注释和onPause方法  * 一个演示感应器在线程中刷新UI的例子 测力器的应用  * */ package uni.sensor; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.widget.TextView; public class ForceometerActivity extends Activity{  SensorManager sensorManager;  TextView accelerationTextView;  TextView maxAccelerationTextView;  float currentAcceleration = 0;  float maxAcceleration = 0;  @Override  protected void onCreate(Bundle savedInstanceState) {   // TODO Auto-generated method stub   super.onCreate(savedInstanceState);   setContentView(R.layout.main);   //获取两个文本显示域   accelerationTextView = (TextView)findViewById(R.id.acceleration);   maxAccelerationTextView = (TextView)findViewById(R.id.maxAcceleration);   //获取sensor服务,选择加速度感应器   sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);   Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);   //注册事件   sensorManager.registerListener(sensorEventListener,   accelerometer,   SensorManager.SENSOR_DELAY_FASTEST);   Timer updateTimer = new Timer("gForceUpdate");   updateTimer.scheduleAtFixedRate(new TimerTask() {   public void run() {   updateGUI();   }   }, 0, 100);  }  //添加的新方法,退出activity的时候,关闭监听器  public void onPause(){   sensorManager.unregisterListener(sensorEventListener);   super.onPause();  }  private final SensorEventListener sensorEventListener = new SensorEventListener() {   //系统设置的重力加速度标准值,设备在水平静止的情况下就承受这个压力,所以默认Y轴方向的加速度值为STANDARD_GRAVITY   double calibration = SensorManager.STANDARD_GRAVITY;   public void onAccuracyChanged(Sensor sensor, int accuracy) { }   public void onSensorChanged(SensorEvent event) {   double x = event.values[0];   double y = event.values[1];   double z = event.values[2];   //计算三个方向的加速度   double a = Math.round(Math.sqrt(Math.pow(x, 2) +   Math.pow(y, 2) +   Math.pow(z, 2)));   //消去原有的重力引起的压力   currentAcceleration = Math.abs((float)(a-calibration));   if (currentAcceleration > maxAcceleration)   maxAcceleration = currentAcceleration;   }   };   private void updateGUI() {    /*     * 推荐的一个刷新UI的方法     * Activity.runOnUiThread(Runnable)     * 在新的线程中更新UI     * Runnable是一个接口,需要你实现run方法,上面的TimerTask就是实现了这个接口同样需要实现run方法     * */    runOnUiThread(new Runnable() {    public void run() {    String currentG = currentAcceleration/SensorManager.STANDARD_GRAVITY    + "Gs";    accelerationTextView.setText(currentG);    accelerationTextView.invalidate();    String maxG = maxAcceleration/SensorManager.STANDARD_GRAVITY + "Gs";    maxAccelerationTextView.setText(maxG);    maxAccelerationTextView.invalidate();    }    });    } }

线程知识和我一样不足的同学,我们一起再学习线程吧,以后会更新相关的学习体会,与大家分享

忘了,还有main.xml文件

<?xml version="1.0" encoding="utf-8"?>     

希望本文所述对大家Android程序设计有所帮助。

更多相关文章

  1. Android引入广播机制的用意。单线程模型Message、Handler、Messa
  2. UWP与Android中如何在多线程中刷新UI
  3. android的线程封装
  4. Android 跨线程更新 UI
  5. android将线程绑定在指定CPU
  6. android的多线程操作(一)
  7. Android主线程里不允许网络操作

随机推荐

  1. Android(安卓)获取本机WIFI及3G网络IP
  2. Android消息机制---MessageQueue的工作原
  3. android 水平滚动 HorizontalScrollView
  4. Android实现开机自启动Service
  5. android之计时器chronometer
  6. Android(安卓)ApiDemos示例解析(33):App->
  7. android9.0 cdma 短信 发不出的问题
  8. android之网格布局GridLayout
  9. android将后台应用置顶及moveTaskToFront
  10. Android(安卓)button防多次点击