android中用线程更新UI,报错only the original thread that created a view hierarchy can touch its views

来源:互联网 发布:紫格尼克效应 知乎 编辑:程序博客网 时间:2024/05/18 03:30

        Android开发中难免要更新UI,比如做一个时钟,时间总要动吧?这时间就要更新UI,但很多时间不方便把更新UI的代码放在主线程中,就比如说做一个精确度到毫秒级的时钟,因为精度是毫秒级的,那么更新时间的频率也要是毫秒级的,不然所谓的毫秒级就没什么意义了。这样一来,就要在很短的时间就更新一次UI,如果放在主线程里做,那么主线程的大部分工作是耗在这了,程序就会很卡,所以一般就会放到一个子线程中去做这些事,这样主线程就不卡了。但是,问题是不能直接在子线程中直接更新UI,先来看一下代码。

        先建一个TextView :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <TextView        android:id="@+id/tv"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world" /></RelativeLayout>

        然后用它来显示当前时间,精确到毫秒,因为精确到毫秒,所以要频繁地更新UI,因此要开一个线程,不然在主线程里做这么频繁的操作,程序要卡死咯。如果直接在线程里更新UI如下:

public class MainActivity extends Activity {TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv=(TextView)findViewById(R.id.tv);MyThread thread=new MyThread();thread.start();}class MyThread extends Thread{@Overridepublic void run() {while(true){;SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");tv.setText(df.format(new Date()));try {Thread.sleep(10);} catch (Exception e) {e.printStackTrace();}}}}}

        这样会报错,only the original thread that created a view hierarchy can touch its views,不能直接在非主线程里更新,解决方法是用handler,代码如下:

public class MainActivity extends Activity {TextView tv;Handler handler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv=(TextView)findViewById(R.id.tv);handler=new Handler(){@Overridepublic void handleMessage(Message msg) {SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");tv.setText(df.format(new Date()));}};MyThread thread=new MyThread();thread.start();}class MyThread extends Thread{@Overridepublic void run() {while(true){handler.sendEmptyMessage(0);try {Thread.sleep(10);} catch (Exception e) {e.printStackTrace();}}}}}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 十个月宝宝拉肚子拉水怎么办 一个月宝宝拉肚子拉水怎么办 五个月的宝宝拉肚子还拉水怎么办 4岁宝宝拉肚子怎么办拉水样 刚出生的婴儿呕奶怎么办 8岁儿童腹泻呕吐怎么办 一岁宝宝呕吐腹泻怎么办 5岁儿童腹泻呕吐怎么办 4岁宝宝呕吐腹泻怎么办 7岁儿童腹泻呕吐怎么办 一个月婴儿呕奶怎么办 一个月婴儿呕奶严重怎么办 6岁宝宝大便干燥怎么办 3岁儿童干咳嗽怎么办 3岁宝宝一直咳嗽怎么办 3岁宝宝风寒咳嗽怎么办 刚出生的宝宝拉奶瓣怎么办 小孩拉痢疾带血怎么办 2岁宝宝有点拉稀怎么办 1岁宝宝有点拉稀怎么办 3岁宝宝有点拉稀怎么办 甲减粘液性水肿怎么办 五个月宝宝断奶不吃奶粉怎么办 八个半月的宝宝不爱吃饭怎么办 十个半月宝宝不爱吃饭怎么办 九个半月宝宝不爱吃饭怎么办 七个半月宝宝不爱吃饭怎么办 8个半月宝宝不爱吃饭怎么办 八个半月宝宝不爱吃饭怎么办 特百惠杯子摔坏后不给换怎么办 特百惠水杯摔裂了怎么办 焖烧杯摔瘪了怎么办 苦瓜和虾一起吃中毒怎么办 乐扣盖子坏了怎么办 小孩上课坐不住好动怎么办 5小孩晚上不睡觉怎么办 一年级的孩子上课好动怎么办 一岁宝宝太好动怎么办 3岁宝宝太好动怎么办 孩子学习注意力不集中怎么办 1岁宝宝皮肤黄怎么办