Android 子线程更新UI的六种方式
1、注意:
(1)子线程需要切换到UI线程或者主线程去更新线程。
(2)但是子线程单独也是可以更新UI的,只是谷歌要求我们需要到UI线程去更新。
eg:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_thread_update_ui);
new Thread(new Runnable() {
@Override
public void run() {
textView.setText("子线程更新ui");
}
});
}
此时我们运行发现,程序没有任何问题。
eg:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_thread_update_ui);
new Thread(new Runnable() {
@Override
public void run() {
textView.setText("子线程更新ui");
Thread.sleep(5000);
}
});
}
当我们在里面添加耗时操作的时候,我们会发现程序崩溃。
原因:在oncreat()方法中,此时viewRootlmp还没有被创建。viewRootlmp在Activity处于onResume之后才被创建的,所以不会执行checkThread方法,自然不会报错。当进行耗时操作时,此时viewRootlmp已经创建成功,所以程序会崩溃。
(3)Android 采用单线程模式:如果采用多线程去更新UI会导致程序的不可控性,多线程会造成资源竞争。就算采用锁来控制,那还是相当于采用单线程模式。
二、子线程更新UI的六种方式
(1)
new Thread(new Runnable() {
@Override
public void run() {
Message message=handler.obtainMessage();
message.what=1;
handler.sendMessage(message);
}
}).start();
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what==1){
textView.setText("子线程更新ui");
}
}
};
(2)
new Thread(new Runnable() {
@Override
public void run() {
textView.post(new Runnable() {
@Override
public void run() {
textView.setText("子线程更新ui");
}
});
}
}).start();
(3)
new Thread(new Runnable() {
@Override
public void run() {
new Handler().post(new Runnable() {
@Override
public void run() {
textView.setText("子线程更新ui");
}
});
}
}).start();
(4)
new Thread(new Runnable() {
@Override
public void run() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
textView.setText("子线程更新ui");
}
},3000);//延迟时长
}
}).start();
(5)
new Thread(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText("慕九");
}
});
}
}).start();
(6)
new updateAsyncTask().execute();
class updateAsyncTask extends AsyncTask<String,Integer,String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... strings) {
publishProgress();
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
textView.setText("子线程更新ui");
}
}
Android 子线程更新UI的六种方式的更多相关文章
- Android子线程更新UI成功
android子线程更新UI成功 今天在写demo的时候,在子线程中更新UI,发现更新成功,记录一下. protected void onCreate(Bundle savedInstanceStat ...
- Android子线程更新UI的方法总结
版权声明:本文为博主原创文章,转载请注明出处:https://i.cnblogs.com/EditPosts.aspx?postid=6121280 消息机制,对于Android开发者来说,应该是非常 ...
- android子线程更新UI
参考:https://www.cnblogs.com/joy99/p/6121280.html 子线程是不能直接更新UI的.Android实现View更新有两组方法,分别是invalidate和pos ...
- Android子线程更新UI主线程方法之Handler
背景: 我们开发应用程序的时候,处于线程安全的原因子线程通常是不能直接更新主线程(UI线程)中的UI元素的,那么在Android开发中有几种方法解决这个问题,其中方法之一就是利用Handler处理的. ...
- Android 子线程更新UI 异常
众所周知,Android是不可以在子线程中直接更新UI的,需要借助Handler或者View.post(Runnable runnable)或者runOnUIThread(Runnable runna ...
- android 子线程更新UI
参考http://examples.javacodegeeks.com/android/core/os/handler/android-handler-example/package com.exam ...
- Android通过子线程更新UI的几种方式
一般情况下,UI的更新都少不了Handler,首先我们先了解一下Handler机制: Handler消息机制 定义 Message 线程间通信的数据单元,可通过message携带需要的数据创建对象:M ...
- Android开发——实现子线程更新UI
Android中线程按功能分的话,可以分为两个,一个是主线程(UI线程),其他的都是子线程 主线程不能执行那些耗时过长的代码或任务(执行耗时过长的代码会出现应用未响应的提示),所以都是使用子线程来执行 ...
- [Android学习笔记]子线程更新UI线程方法之Handler
关于此笔记 不讨论: 1.不讨论Handler实现细节 2.不讨论android线程派发细节 讨论: 子线程如何简单的使用Handler更新UI 问题: android开发时,如何在子线程更新UI? ...
- Android可以子线程更新UI?
初了解Android的时候,就知道Android是不能在子线程更新UI的,不然程序会直接抛出异常,告诉你,别给我在自线程搞事情! 但是,这个是针对普通的view做的限制,而TextureView,Su ...
随机推荐
- 题解 - Japanese Student Championship 2021
前言:这场的题解由于蓝桥杯比赛拖延几天才发 关于本篇题解,目前还是有部分题没有解答出来正在加油补题ing 补题链接:Here A - Competition 题意:给定 \(X,Y,Z\) 代表的意义 ...
- AtCoder ABC 181 个人题解(本场GJ x 3)
补题链接:Here A - Heavy Rotation 对 \(N\) 进行奇偶判断,奇数穿 Black .偶数穿 White B - Trapezoid Sum 前 \(n\) 项和公式:\(S_ ...
- Oracle JDK7 bug 发现、分析与解决实战
本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/8f34CaTp--Wz5pTHKA0Xeg作者:vivo 官网商城开发团队 众所周知,Ora ...
- 应届生必读:Java真实项目的开发流程和常用工具
本文出自本人写的书,谢绝转载,更勿抄袭. 本人有多年的Java面试官经验,经常要和一些包装项目经验的求职者打交道.当然平时也兼职做些Java面试辅导工作,最近也陆续帮一些在校生朋友成功找到Java工作 ...
- 如何绕过某讯手游保护系统并从内存中获取Unity3D引擎的Dll文件
某讯的手游保护系统用的都是一套,在其官宣的手游加固功能中有一项宣传是对比较热门的Unity3d引擎的手游保护方案,其中对Dll文件的保护介绍如下, "Dll加固混淆针对Unity游戏,对 ...
- ICDM'23 BICE论文解读:基于双向LSTM和集成学习的模型框架
本文分享自华为云社区<ICDM'23 BICE论文解读>,作者:云数据库创新Lab. 导读 本文<Efficient Cardinality and Cost Estimation ...
- 接口自动化测试复习巩固第二天,管理员后端验证和接口抓包+requests实现
接口自动化测试第二天,需要用到的第三方库有os,openpyxl,json,pytest,requests 首选我们今天的目标是写出一个测试登录用例的脚本,这里我用的是分层设计,整个框架暂时被分为工具 ...
- 如何实现 Excel 表格转置(行列互换)
直接上经验贴: https://baijiahao.baidu.com/s?id=1690475581736550777&wfr=spider&for=pc 大概就是 先复制粘贴,在粘 ...
- Linux性能分析——TOP命令详解
Linux性能分析--TOP命令详解 1.Top命令介绍 Linux系统中,Top命令主要用于实时运行系统的监控,包括Linux内核管理的进程或者线程的资源占用情况. 这个命令对所有正在运行的进程和系 ...
- 【C】《C专家编程》阅读体会
[来源]https://mp.weixin.qq.com/s/0kmN5knql4yrOuUcnebwIQ