【Based Android】Android Sensor感应器介绍(二)线程中刷新UI 创建一个android测力计...
上一篇文章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测力计...相关推荐
- android 不能在子线程中更新ui的讨论和分析
问题描述 做过android开发基本都遇见过 ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是只能在主线程中更改 ui,子线程要修改 ...
- Android利用Looper在子线程中改变UI
MainActivity如下: package cn.testlooper; import android.app.Activity; import android.os.Bundle; import ...
- Android入门-新手如何成功创建一个Android小应用
原文链接:http://android.eoe.cn/topic/overview 第一课程:Building Your First App [本课内容简介]欢迎加入到安卓应用的开发大潮中!这门课程会 ...
- 从零开始创建一个Android主屏幕Widget
登录 / 注册 IT168首页 手机 整机 DIY硬件 摄影 消费数码 数字家电 企业IT 企业商用 办公 互动 社区 全部频道 IT168技术开发频道 IT168首页 > 技术开发 > ...
- 使用Eclipse创建一个Android程序方法
要编写Android程序,需要安装JDK.Eclipse和Android SDK. Android SDK的安装路径不要在program file或program file(x86)下,否则在debu ...
- 使用Tensorflow Lite创建一个Android AI应用
目录 下一步 在这里,我们使用TensorFlow Lite解释器检查图像并产生其输出. 这是将神经网络与Android上的TensorFlow Lite结合使用的系列文章中的第三篇.在本系列的第2部 ...
- 为什么不能在子线程中更新UI
首先声明一点:子线程里面是可以更新UI的--创建一个空白的Activity,在其xml文件中放一个空白TextView,Java代码如下: @Override protected void onCre ...
- C#子线程中更新ui
本文实例总结了C#子线程更新UI控件的方法,对于桌面应用程序设计的UI界面控制来说非常有实用价值.分享给大家供大家参考之用.具体分析如下: 一般在winform C/S程序中经常会在子线程中更新控件的 ...
- EXC_BAD_ACCESS(code=2,address=0xcc 异常解决 及 建议不要在子线程中刷新界面
EXC_BAD_ACCESS(code=2,address=0xcc 异常解决 及 建议不要在子线程中刷新界面 参考文章: (1)EXC_BAD_ACCESS(code=2,address=0xcc ...
最新文章
- ABS是啥,为什么区块链可以与它完美结合?
- 如何在Cordova Android 7.0.0 以下版本集成最新插件 极光插件为例
- linux tcp文件分包_Linux网络监控工具大点兵
- html5能火多久,html5有多火?看完这个你就知道了!
- OpenGL杂七杂八
- AE “每用户订阅上的所有人SID 不存在”
- [转]20款Notepad++插件下载和介绍
- winform使用fastreport制作报表(二)使用
- 删除留言代码html代码,使用JavaScript代码批量自动删除QQ留言板内容
- jquery+baidu map api 仿安居客地图找房源(基于百度地图)
- Android Studio- 把SVN项目下载到 本地的 操作方法
- 回收站无法清空,提示无法读源文件或磁盘的解决办法
- c语言change函数用法,通过值和引用函数
- 三星oneui主屏幕费电_三星最新力作,第三方桌面无处遁形,OneUI越来越自由
- Java课程设计-画图工具
- sql语法基础,sql分组查询
- java调用jasper_Java开源报表Jasper入门(2) -- 使用JasperSoft Studio创建一个简单报表
- 剑指 Offer 05. 替换空格
- Naive UI使用useDialog、useMessage、useNotification、useLoadingBar,超实用
- 将jpg图片转换成yuv420(NV12)数据文件