博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android基础---->子线程更新UI
阅读量:4680 次
发布时间:2019-06-09

本文共 2212 字,大约阅读时间需要 7 分钟。

 和许多其他的GUI 库一样,Android 的UI 也是线程不安全的。也就是说,如果想要更新应用程序里的UI 元素,则必须在主线程中进行,否则就会出现异常。了解AsyncTask的用法,请参见我的博客:()今天我们就来学习一下有关UI更新的一些知识。

 

目录:

 

 今天我们通过一个小案例,来说明更新UI的全部测试内容:项目结构如下

 

在子线程中更新UI

一、 在MainActivity.java的onCreate方法中做一些初始化工作,初始化textView

private TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    textView = (TextView) findViewById(R.id.textView);}

 

二、 点击threadUpdateUI按钮,触发在子线程中更新UI的事件

// 在子线程中更新UIpublic void threadUpdateUI(View view) {    new Thread(new Runnable() {        @Override        public void run() {            textView.setText("I love you.");        }    }).start();}

 

三、 运行结果如下,说明在子线程中的确不能更新UI

  • 日志打印结果:  Only the original thread that created a view hierarchy can touch its views.
  • 测试真机崩溃:

 

用Handler机制实现UI的更新

一、 定义一个Handler,用于接收处理消息

public static final int UPDATE_TEXT = 1;private Handler handler = new Handler() {    @Override    public void handleMessage(Message msg) {        switch (msg.what) {            case UPDATE_TEXT:                textView.setText("I Love you.");                break;            default:                break;        }    }}

 

二、 点击按钮,触发在子线程中发送消息的事件

// 用handler处理上述问题public void handlerUpdate(View view) {    new Thread(new Runnable() {        @Override        public void run() {            Message message = new Message();            message.what = UPDATE_TEXT;            handler.sendMessage(message); // 将Message对象发送出去        }    }).start();}

 结果正常,textView显示为:I love you

 

用AsyncTask机制实现UI的更新

 一、 创建一个继承AsyncTask的内部类,命名为:MyAsynTask

private class MyAsynTask extends AsyncTask
{ @Override protected Void doInBackground(Void... params) { return null; } @Override protected void onPostExecute(Void aVoid) { textView.setText("I love you"); }}

 

二、 点击按钮,创建AsyncTask的实例,并调用execute方法:

// 用AsyncTask处理上述问题public void asynTask(View view) {    MyAsynTask myAsynTask = new MyAsynTask();    myAsynTask.execute();}

 结果正常,textView显示为:I love you。

 

友情链接

  关于AsyncTask类的详细使用,请参见我的博客           ()

 

作者:   
出处: 
格言:你尽力了,才有资格说自己的运气不好。
版权:本文版权归作者huhx和博客园共有,欢迎转载。未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/Jeely/p/10949301.html

你可能感兴趣的文章
图片,base64 互转
查看>>
cache—主存—辅存三级调度模拟
查看>>
Java线程的定义
查看>>
Python-面向对象(组合、封装与多态)
查看>>
Mininet
查看>>
COSC2531 Programming Fundamentals
查看>>
设计模式系列 - 访问者模式
查看>>
20180507小测
查看>>
eclipse左侧不见
查看>>
python会缓存小的整数和短小的字符
查看>>
格网与四叉树索引
查看>>
多张照片拍摄、图片浏览
查看>>
html(5) css
查看>>
Azure Web连接到Azure MySql Db
查看>>
Linux shell 命令判断执行语法 ; , && , ||
查看>>
vim代码格式化插件clang-format
查看>>
RTP Payload Format for Transport of MPEG-4 Elementary Streams over http
查看>>
关于sql优化的一个小总结
查看>>
Java环境变量设置
查看>>
【JBPM4】判断节点decision 方法3 handler
查看>>