AndroidStudio子线程更新UI的几种方式
在安卓开发中,大部分情况下是不能在子线程直接更新UI的,只能在UI线程更新UI,其根本原因在于加入在一个Activity中有多个线程去更新UI,且没有加锁机制,可能会产生界面混乱的情况,但是如果都加锁的话会导致性能下降。所以android提供了一套子线程更新UI的机制。在某些特殊的情况下是可以直接在子线程更新UI的。
布局界面只有一个textView
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.widget.TextView;public class HandlerActivity extends Activity {private TextView textView;@SuppressLint("HandlerLeak")Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {textView.setText("okok");super.handleMessage(msg);}};//第一种 handler post runnable//其本质也是发送的一个message对象private void handler1() {handler.post(new Runnable() {@Overridepublic void run() {textView.setText("ok");}});}//第二种 handler send messageprivate void handler2() {handler.sendEmptyMessage(1);}//第三种 runOnUiThreadprivate void updateUI(){runOnUiThread(new Runnable() {@Overridepublic void run() {textView.setText("okokok");}});}//第四种 view post runnableprivate void viewUI(){textView.post(new Runnable() {@Overridepublic void run() {textView.setText("okokokok");}});}@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_handler);textView = findViewById(R.id.tv_handler);new Thread() {@Overridepublic void run() {super.run();try {Thread.sleep(2000);//handler1();//handler2();//updateUI();viewUI();} catch (InterruptedException e) {e.printStackTrace();}}}.start();}
}
以上四种方式其本质其实都是通过handler发送message去通知UI线程更新UI
直接在子线程更新UI
public class ThreadActivity extends Activity {private TextView textView;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_handler);textView = findViewById(R.id.tv_handler);new Thread() {@Overridepublic void run() {super.run();textView.setText("1111");//try {// Thread.sleep(2000);// textView.setText("1111");// } catch (InterruptedException e) {// e.printStackTrace();// }}}.start();}@Overrideprotected void onResume() {super.onResume();}
}
这段代码执行下来是可以执行的。但是如果在子线程中执行线程休眠的方法,就会爆出 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.异常。其根本原因在于android实现更新UI的对象。ViewRootImpl是在onResume方法中去初始化的,由于会先执行onCreate方法,所以此时的viewRootImpl还没有被初始化。
AndroidStudio子线程更新UI的几种方式相关推荐
- AndroidUI——后台线程更新UI的几种方式
开发Android程序时经常会用到后台线程请求服务器数据,当请求完数据后更新UI时,经常遇到回调函数中和UI相关的语句无法执行,甚至有时候会抛异常. 下面的例子我会讲到三种方法更新UI,例子非常简单, ...
- Android子线程更新UI的方法总结
消息机制,对于Android开发者来说,应该是非常熟悉.对于处理有着大量交互的场景,采用消息机制,是再好不过了.有些特殊的场景,比如我们都知道,在Android开发中,子线程不能更新UI,而主线程又不 ...
- android 关于关于子线程更新UI的一些事
我们在看一些书或者博客时总是会看到一句话"android更新UI操作都是在Main主线程中,子线程中不能进行UI更新操作"那么,在子线程中真的不能进行UI的更新操作吗? //源码环 ...
- Android中Activity、Window、ViewRootImpl与子线程更新UI
三者层级关系 1.Window Window是一个抽象类,唯一的实现类是PhoneWindow Window分为三种类型应用Window.子Window.系统Window.子Window无法独立存在必 ...
- Android为什么不能在子线程更新UI
Android为什么不能在子线程更新UI Android为什么不能在子线程更新UI? 如果不做这个校验,是不是我也可以正常在子线程更新UI 但是google为什么要这样去设计呢 ViewRootImp ...
- 面试官问我:Andriod为什么不能在子线程更新UI?
记得看文章三部曲,点赞,评论,转发. 微信搜索[程序员小安]关注还在移动开发领域苟活的大龄程序员,"面试系列"文章将在公众号同步发布. 1.前言 看完<你为什么在现在的公司不 ...
- android ui 最新教程,Android更新UI的五种方式,androidui五种
Android更新UI的五种方式,androidui五种handler.post activity.runOnUiThread view.post handler+Thread AsyncTask 例 ...
- [Android开发]Android更新UI的五种方式
Android更新UI的五种方式: 1.handler.post 2.activity.runOnUiThread 3.view.post 4.handler+Thread 5.AsyncTask 下 ...
- C#利用Invoke和委托实现子线程更新UI(方式1)
UI布局如下 委托定义如下: public delegate void SetMessageDelegate(string message); From1的代码如下: public partial c ...
最新文章
- java 折半_折半算法
- 记一次kubect init初始化端口占用问题
- mysql 1005_MYSQL使用错误 MYSQL中ERROR 1005
- django:bootstrap table加载django返回的数据
- [Java] 蓝桥杯PREV-3 历届试题 带分数
- 开发者应该关注的五项Web新兴技术:WebGL和SVG名列其中
- C Tricks(十六)—— 复制字符串
- JS实现动态生成二维码,并在中间插入logo
- 倒立摆:Simulink建模
- MCGS昆仑动态显示屏组态环境搭建介绍
- GitLab迁移升级大作战
- 项目管理project模板_项目管理常用的10张图表推荐
- !doctype html public 广告飘窗不能用了,页面广告飘窗
- 如何接入易班第三方登录
- 迷你HTTP服务器+小型博客
- Linux 系统编程-文件IO-文件描述符、open函数的使用、实现touch命令
- Ruby ERB模板注入检测
- userenv和sys_context函数
- 街头立体画的创作过程
- 遇见你,是最美的意外