上一篇文章http://www.cnblogs.com/octobershiner/archive/2011/11/06/2237880.html介绍了sensor的基本知识以及一个使用其中加速度感应器获取数据的例子。

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

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

  1 /*   2  * @author octobershiner   3  * 2011 07 27   4  * SE.HIT   5  * 这是《Android 2 高级编程》中的一个实例,关于感应器的使用很普通,但是介绍了一种使用感应器的应用如何刷新UI的好办法,值得学习   6  * 我添加了一些注释和onPause方法   7  * 一个演示感应器在线程中刷新UI的例子 测力器的应用   8  * */    9    10 package uni.sensor;   11    12 import java.util.Timer;   13 import java.util.TimerTask;   14    15 import android.app.Activity;   16 import android.content.Context;   17 import android.hardware.Sensor;   18 import android.hardware.SensorEvent;   19 import android.hardware.SensorEventListener;   20 import android.hardware.SensorManager;   21 import android.os.Bundle;   22 import android.widget.TextView;   23    24 public class ForceometerActivity extends Activity{   25    26     SensorManager sensorManager;   27     TextView accelerationTextView;   28     TextView maxAccelerationTextView;   29        30     float currentAcceleration = 0;   31     float maxAcceleration = 0;   32    33     @Override   34     protected void onCreate(Bundle savedInstanceState) {   35         // TODO Auto-generated method stub   36         super.onCreate(savedInstanceState);   37         setContentView(R.layout.main);   38         //获取两个文本显示域   39         accelerationTextView = (TextView)findViewById(R.id.acceleration);   40         maxAccelerationTextView = (TextView)findViewById(R.id.maxAcceleration);   41         //获取sensor服务,选择加速度感应器   42         sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);   43         Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);   44         //注册事件   45         sensorManager.registerListener(sensorEventListener,   46         accelerometer,   47         SensorManager.SENSOR_DELAY_FASTEST);   48    49         Timer updateTimer = new Timer("gForceUpdate");   50         updateTimer.scheduleAtFixedRate(new TimerTask() {   51         public void run() {   52         updateGUI();   53         }   54         }, 0, 100);   55    56            57     }   58        59     //添加的新方法,退出activity的时候,关闭监听器   60     public void onPause(){   61         sensorManager.unregisterListener(sensorEventListener);   62         super.onPause();   63     }   64    65        66     private final SensorEventListener sensorEventListener = new SensorEventListener() {   67         //系统设置的重力加速度标准值,设备在水平静止的情况下就承受这个压力,所以默认Y轴方向的加速度值为STANDARD_GRAVITY   68         double calibration = SensorManager.STANDARD_GRAVITY;   69            70         public void onAccuracyChanged(Sensor sensor, int accuracy) { }   71            72         public void onSensorChanged(SensorEvent event) {   73         double x = event.values[0];   74         double y = event.values[1];   75         double z = event.values[2];   76            77         //计算三个方向的加速度   78         double a = Math.round(Math.sqrt(Math.pow(x, 2) +   79         Math.pow(y, 2) +   80         Math.pow(z, 2)));   81            82         //消去原有的重力引起的压力   83         currentAcceleration = Math.abs((float)(a-calibration));   84         if (currentAcceleration > maxAcceleration)   85         maxAcceleration = currentAcceleration;   86         }   87         };   88    89         private void updateGUI() {   90             /*  91              * 推荐的一个刷新UI的方法  92              * Activity.runOnUiThread(Runnable)  93              * 在新的线程中更新UI  94              * Runnable是一个接口,需要你实现run方法,上面的TimerTask就是实现了这个接口同样需要实现run方法  95              * */   96             runOnUiThread(new Runnable() {   97             public void run() {   98             String currentG = currentAcceleration/SensorManager.STANDARD_GRAVITY   99             + "Gs";  100             accelerationTextView.setText(currentG);  101             accelerationTextView.invalidate();  102             String maxG = maxAcceleration/SensorManager.STANDARD_GRAVITY + "Gs";  103             maxAccelerationTextView.setText(maxG);  104             maxAccelerationTextView.invalidate();  105             }  106             });  107               108             }  109   110         111 }

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

忘了,还有main.xml文件

<?xml version="1.0" encoding="utf-8"?>  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:orientation="vertical"  android:layout_width="fill_parent"  android:layout_height="fill_parent">  <TextView android:id="@+id/acceleration"  android:gravity="center"  android:layout_width="fill_parent"  android:layout_height="wrap_content"  android:textStyle="bold"  android:textSize="32sp"  android:text="CENTER"  android:editable="false"  android:singleLine="true"  android:layout_margin="10px"/>  

<TextView android:id="@+id/maxAcceleration"  android:gravity="center"  android:layout_width="fill_parent"  android:layout_height="wrap_content"  android:textStyle="bold"  android:textSize="40sp"  android:text="CENTER"  android:editable="false"  android:singleLine="true"  android:layout_margin="10px"/>  

</LinearLayout>  

转载于:https://www.cnblogs.com/octobershiner/archive/2011/11/09/2242991.html

【Based Android】Android Sensor感应器介绍(二)线程中刷新UI 创建一个android测力计...相关推荐

  1. android 不能在子线程中更新ui的讨论和分析

    问题描述 做过android开发基本都遇见过 ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是只能在主线程中更改 ui,子线程要修改 ...

  2. Android利用Looper在子线程中改变UI

    MainActivity如下: package cn.testlooper; import android.app.Activity; import android.os.Bundle; import ...

  3. Android入门-新手如何成功创建一个Android小应用

    原文链接:http://android.eoe.cn/topic/overview 第一课程:Building Your First App [本课内容简介]欢迎加入到安卓应用的开发大潮中!这门课程会 ...

  4. 从零开始创建一个Android主屏幕Widget

    登录 / 注册 IT168首页 手机 整机 DIY硬件 摄影 消费数码 数字家电 企业IT 企业商用 办公 互动 社区 全部频道 IT168技术开发频道 IT168首页 > 技术开发 >  ...

  5. 使用Eclipse创建一个Android程序方法

    要编写Android程序,需要安装JDK.Eclipse和Android SDK. Android SDK的安装路径不要在program file或program file(x86)下,否则在debu ...

  6. 使用Tensorflow Lite创建一个Android AI应用

    目录 下一步 在这里,我们使用TensorFlow Lite解释器检查图像并产生其输出. 这是将神经网络与Android上的TensorFlow Lite结合使用的系列文章中的第三篇.在本系列的第2部 ...

  7. 为什么不能在子线程中更新UI

    首先声明一点:子线程里面是可以更新UI的--创建一个空白的Activity,在其xml文件中放一个空白TextView,Java代码如下: @Override protected void onCre ...

  8. C#子线程中更新ui

    本文实例总结了C#子线程更新UI控件的方法,对于桌面应用程序设计的UI界面控制来说非常有实用价值.分享给大家供大家参考之用.具体分析如下: 一般在winform C/S程序中经常会在子线程中更新控件的 ...

  9. EXC_BAD_ACCESS(code=2,address=0xcc 异常解决 及 建议不要在子线程中刷新界面

    EXC_BAD_ACCESS(code=2,address=0xcc 异常解决 及 建议不要在子线程中刷新界面 参考文章: (1)EXC_BAD_ACCESS(code=2,address=0xcc ...

最新文章

  1. ABS是啥,为什么区块链可以与它完美结合?
  2. 如何在Cordova Android 7.0.0 以下版本集成最新插件 极光插件为例
  3. linux tcp文件分包_Linux网络监控工具大点兵
  4. html5能火多久,html5有多火?看完这个你就知道了!
  5. OpenGL杂七杂八
  6. AE “每用户订阅上的所有人SID 不存在”
  7. [转]20款Notepad++插件下载和介绍
  8. winform使用fastreport制作报表(二)使用
  9. 删除留言代码html代码,使用JavaScript代码批量自动删除QQ留言板内容
  10. jquery+baidu map api 仿安居客地图找房源(基于百度地图)
  11. Android Studio- 把SVN项目下载到 本地的 操作方法
  12. 回收站无法清空,提示无法读源文件或磁盘的解决办法
  13. c语言change函数用法,通过值和引用函数
  14. 三星oneui主屏幕费电_三星最新力作,第三方桌面无处遁形,OneUI越来越自由
  15. Java课程设计-画图工具
  16. sql语法基础,sql分组查询
  17. java调用jasper_Java开源报表Jasper入门(2) -- 使用JasperSoft Studio创建一个简单报表
  18. 剑指 Offer 05. 替换空格
  19. Naive UI使用useDialog、useMessage、useNotification、useLoadingBar,超实用
  20. 将jpg图片转换成yuv420(NV12)数据文件

热门文章

  1. .Net高级技术笔记
  2. 入门系列之使用Sysdig监视您的Ubuntu 16.04系统
  3. vue组件中的样式属性:scoped,解决在父组件中无法修改子组件样式问题
  4. Cocos Creator 键盘监听事件
  5. Maven实践:版本管理 SNAPSHOT
  6. android控件跟随手势滑动改变位置
  7. C++STL源代码学习(之slist篇)
  8. 邮箱自动转发攻击邮件服务器
  9. centos的网络配置
  10. ios - Push远程通知代码设置 DeviceToken