使用Handler类来更新UI
在android里面,我们经常要上网获取一些数据,然后更新UI,但获取数据是要时间的,如果在主线程里面直接使用获取数据的代码的话。整个activity就会卡在那,直至你获取到数据更新完UI才会加载完成。在android里面,如果一个activity卡了5秒,就会被强制回收掉。
回想一下我们用过的App,遇到要加载的时候,一般是怎么样的呢?肯定不会是让界面卡死在那里的,最不济的也有一个"加载中"的圈圈在那转吧!然后数据加载出来后就消失。
然而android有个很微妙的机制,更新UI只能在UI线程,就是在我们的主线程,而访问网络只能在其他线程,要怎么办呢?答案就是使用Handler类。
主要的思路是这个样子的:
1、让程序一开始就有一个“加载中”的圈圈(Dialog)。
2、Handler是在主线程实例化的,属于主线程。
3、在主线程开启另一个线程,用来访问网络加载数据,加载完后,发消息给Handler类。
4、Handler收到消息后,更新UI,再取消那个"加载中"的圈圈。
假设一种情况:要访问网络,找到一段句子,然后更新我们的TextView
private Handler handler;//声明Hanler private TextViwe tv;//声明TextView
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first_page); //在主线程中实例化Handler
handler = new Handler(){ @Override
//收到消息时该做的事情
public void handleMessage(Message msg) {
super.handleMessage(msg); //更新TextView UI
//取消掉"加载中"的框框
dialog.cancel(); }
}; //创建一个窗口来等待加载
dialog = new ProgressDialog(this);
dialog.setMessage("数据初始化中...");
dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(false);
dialog.show(); //开启新的线程来访问网络,获取数据
new Thread(new Runnable() {
@Override
public void run() { //访问网络 //给Handler发消息
Message ok = new Message();
handler.sendMessage(ok); }
}).start(); }//end onCreate
简述一下activity运行的顺序: 一开始打开App时,activity会把所有的声明啊,实例化啊,布局啊什么的都弄好。而后就进入到dialog.show();这个地方,然后整个界面就是一个圈圈在转啊转啊。同时,开启了一个线程去访问网络。即时一个线程在转啊转圈圈(Dialog),另一个线程去访问了网络,获取数据,互不干扰。等到获取完数据后,会实例化一个Message类,给Handler发信息。Handler接收到信息后,更新UI,然后dialog.cancel();取消掉圈圈。然后我们看到的就是更新好的界面了。
以上只是,简洁化的代码和口头的语言,应该还比较易懂。
使用Handler类来更新UI的更多相关文章
- Android开发学习之路-使用Handler和Message更新UI
在Android中,在非主线程中更新UI控件是不安全的,app在运行时会直接Crash,所以当我们需要在非主线程中更新UI控件,那么就需要用到Handler和Message来实现 Demo中,使用到一 ...
- 关于runOnUiThread()与Handler两种更新UI的方法
在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面显示常会报错.抛出异常:android.view.ViewRoot ...
- 记录一下关于在工具类中更新UI使用RunOnUiThread犯的极其愚蠢的错误
由于Android中不能在子线程中更新ui,所以平时在子线程中需要更新ui时可以使用Android提供的RunOnUiThread接口,但是最近在写联网工具类的时候,有时候会出现联网异常,这个时候为了 ...
- 【收藏】Android更新UI的几种常见方法
----------------将会调用onDraw()重绘控件---------------- 1.view.invalidate刷新UI(主线程) 2.view.postInvalidate刷 ...
- android四种更新UI的方法
笔记: // 使用handler.post(Runnable)更新UI public void updateUI_Fun1() { new Thread() { public void run() { ...
- android 子线程更新UI
参考http://examples.javacodegeeks.com/android/core/os/handler/android-handler-example/package com.exam ...
- 四种更新UI的方法
笔记: // 使用handler.post(Runnable)更新UI public void updateUI_Fun1() { new Thread() { public void run() ...
- 学习通过Thread+Handler实现非UI线程更新UI组件
[Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则 ...
- Android子线程更新UI主线程方法之Handler
背景: 我们开发应用程序的时候,处于线程安全的原因子线程通常是不能直接更新主线程(UI线程)中的UI元素的,那么在Android开发中有几种方法解决这个问题,其中方法之一就是利用Handler处理的. ...
随机推荐
- Node.js小白开路(一)-- fs篇
文件操作在我们的日常功能模块之中是十分的常见的内容,nodeJS也不例外的为我们提供了之一操作内容,当时在我们了解文件操作的之前我们先来了解一下链接. 连接可以理解成为一个纸箱相关文件内容的地址,其主 ...
- 005——VUE中的v-text与v-html的使用
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- delete和truncate区别
相同之处:truncate在功能上与不带WHERE子句的delete 语句相同:二者均删除表中的全部行.小心使用truncate,删除后就没有了 1.delete : 删除"表格记录&quo ...
- 解决AndroidStudio导入项目在 Building gradle project info 一直卡住
Android Studio导入项目的时候,一直卡在Building gradle project info这一步,主要原因还是因为被墙的结果.gradle官网虽然可以访问,但是速度连蜗牛都赶不上.. ...
- Android 之Navicat for SQLite 数据库介绍
Navicat for SQLite 是一套专为SQLite 设计的强大数据库管理及开发工具 Navicat for SQLite 是一套专为SQLite 设计的强大数据库管理及开发工具.它可以 ...
- 兼容 数组 api map代码
if(!("map" in Array.prototype)) Array.prototype.map=function(fun){ for(var i=0,arr=[]; i&l ...
- JSONP学习笔记
1. 实现跨域请求的三种方法 本地代理.Flash.Script标签(img,iframe,link也可以,具有src属性) 2. JSONP全称:JSON With Padding(使用内嵌的方式把 ...
- Quartz 2D编程指南(1) - 概览
Quartz 2D编程指南是论坛会员德鲁伊翻译的国外的Quartz 2D一系列学习资料,供大家参考 Quartz 2D是一个二维图形绘制引擎,支持iOS环境和Mac OS X环境.我们可以使用Quar ...
- 转载.怎样在Quartus II中转化HDL文件为bsf文件?
步骤1 新建或打开Quartus II工程,用QII自带文本编辑器打开HDL文件. 图1 用QII自带的文本编辑器打开HDL文件 步骤2 选择File>Create / Update>Cr ...
- browser-sync 服务器使用
1. 安装 npm install browser-sync or yarn add browser-sync 2. 使用(集成gulp) 备注: gulp 安装使用此处不介绍 默认的端口是3000, ...