Android中多线程编程(三)Handler更新UI的方式
Handler更新UI的方式和原因以及遇到的问题
1.方式:
仅仅能通过Handler来更新UI。
代码例如以下:
package com.chengdong.su.handlerdemo;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
/**
* android中更新UI的方式
*
* @author scd
*
*/
public class SixActivity extends Activity {
private String TAG = getClass().getSimpleName();
private String mName = "HandlerThread";
private TextView mView;
/** the object of the Handler */
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
Log.d(TAG, "------>handleMessage() 主线程:" + Thread.currentThread());
mView.setText("主线程02");
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
Log.d(TAG, "------>onCreate() 主线程:" + Thread.currentThread());
new Thread() {
public void run() {
try {
Thread.sleep(2000);
Log.d(TAG, "------>Thread() 子线程:" + Thread.currentThread());
// updateUI01();
// updateUI02();
// updateUI03();
updateUI04();
} catch (InterruptedException e) {
e.printStackTrace();
}
};
}.start();
}
/**
* init the view
*/
private void init() {
mView = (TextView) findViewById(R.id.textView1);
}
/**
* 更新UI的方式1
*/
public void updateUI01() {
Log.d(TAG, "------>updateUI01() Thread() 子线程:" + Thread.currentThread());
mHandler.post(new Runnable() {
@Override
public void run() {
Log.d(TAG,
"------>updateUI01() Thread() run() 主线程:"
+ Thread.currentThread());
mView.setText("主线程01");
}
});
}
/**
* 更新UI的方式2
*/
public void updateUI02() {
Log.d(TAG,
"------>updateUI02() Thread() 子线程:" + Thread.currentThread());
mHandler.sendEmptyMessage(0);
}
/**
* 更新UI的方式3
*/
public void updateUI03() {
Log.d(TAG,
"------>updateUI03() Thread() 子线程:" + Thread.currentThread());
// 更新UI界面中的组件
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d(TAG,
"------>updateUI03() Thread() run() 主线程:"
+ Thread.currentThread());
mView.setText("主线程03");
}
});
}
/**
* 更新UI的方式4
*/
public void updateUI04() {
Log.d(TAG,
"------>updateUI04() Thread() 子线程:" + Thread.currentThread());
mView.post(new Runnable() {
@Override
public void run() {
Log.d(TAG,
"------>updateUI04() Thread() run() 主线程:"
+ Thread.currentThread());
mView.setText("主线程04");
}
});
}
}
推荐使用第一种和另外一种。
2.使用Handler更新UI的原因:
假设当前线程和主线程不相等的话,更新UI就会抛出异常。
Activity检查当前线程和主线程是否相等是在onResume()方法才開始的。
所以在新开启的线程。假设不休眠直接更新UI的话不会抛出异常。
假设休眠再做更新UI操作的话就会抛出异常。
样例例如以下:(不要这样使用,仅仅是为了演示说明)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
Log.d(TAG, "------>onCreate() 主线程:" + Thread.currentThread());
new Thread() {
public void run() {
// 不会出现异常
// mView.setText("主线程02");
try {
Thread.sleep(2000);
// 出现异常
mView.setText("主线程02");
} catch (InterruptedException e) {
e.printStackTrace();
}
};
}.start();
}
3. Android开发中Handler的使用遇到的问题:
1.不能在子线程中更新UI。
2.假设在子线程创建Handler的时候,一定要创建一个Looper对象:Looper.prepare();
Android中多线程编程(三)Handler更新UI的方式的更多相关文章
- Android多线程更新UI的方式
Android下,对于耗时的操作要放到子线程中,要不然会残生ANR,本次我们就来学习一下Android多线程更新UI的方式. 首先我们来认识一下anr: anr:application not rep ...
- Android中JNI编程的那些事儿(1)
转:Android中JNI编程的那些事儿(1)http://mobile.51cto.com/android-267538.htm Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须 ...
- Android中H5和Native交互的两种方式
Android中H5和Native交互的两种方式:http://www.jianshu.com/p/bcb5d8582d92 注意事项: 1.android给h5页面注入一个对象(WZApp),这个对 ...
- android Handler更新UI
android中经常需要更新界面某个元素的值,但是在主线程中是不可以直接更新主线程的值.这里推荐通过handler机制来更新值. 一Handler的定义: 主要接受子线程发送的数据, 并用此数据配合主 ...
- Android多线程编程<二>Handler异步消息处理机制之Message
Message(消息): 一. Message的字段: 在Android中,Message作为线程之间(主要是子线程和UI主线程之间)数据交换的载体,通过Handler去传递.它 ...
- Android开发 ---多线程操作:Handler对象,消息队列,异步任务下载
效果图: 1.activity_main.xml 描述:定义了六个按钮 <?xml version="1.0" encoding="utf-8"?> ...
- [Android学习笔记]Android中多线程开发的一些概念
线程安全: 在多线程的情况下,不会因为线程之间的操作而导致数据错误. 线程同步: 同一个资源,可能在同一时间被多个线程操作,这样会导致数据错误.这是一个现象,也是一个问题,而研究如何解决此类问题的相关 ...
- Android 快速切换到主线程更新UI的几种方法
此最近看了网上,在子线程更新UI的方法,说法很多,但都不是很全面.在此我争取做到总结的全面一些,希望以后对自己,对大家都有一些帮助. 方法一: view.post(Runnable action) 假 ...
- Android中多线程下载列表的封装实现(含进度反馈)
来源:http://blog.csdn.net/u011638883/article/details/17347015 实现了一下Android中的文件多线程下载模块,支持自定义线程数.断点续传.下载 ...
随机推荐
- 左偏树自己的一点理解【hdu1512】【Monkey King】
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=34693563 向大(hei)佬(e)势力学(di ...
- ASP.net MVC 基于角色的权限控制系统的实现
一.引言 我们都知道ASP.net mvc权限控制都是实现AuthorizeAttribute类的OnAuthorization方法. 下面是最常见的实现方式: public class Custom ...
- VUE -- stylus入门使用方法
sizes() 15px 10px sizes()[0] // => 15px stylus介绍 是个什么鬼?对于开发来说,CSS的弱点在于静态化.我们需要一个真正能提高开发效率的工具,LESS ...
- 设计模式之工厂模式之简单工厂(php实现)
github源码地址: git@github.com:ZQCard/design_pattern.git 1.简单工厂模式 特点:将调用者与创建者分离,调用者直接向工厂请求,减少代码的耦合.提高系统的 ...
- C#拦截系统消息的方法-Application.AddMessageFilter
C#拦截系统消息的方法Application.AddMessageFilter Application.AddMessageFilter这个方法可以接收系统发出的消息: 首先定义一个类,继承IMess ...
- MongoDB系列四:解决secondary的读操作
http://blog.itpub.net/26812308/viewspace-2124660/ 在Replica sets 中的secondary节点默认是不可读的.使用Replica Sets实 ...
- input 中 datetime-local 方法
<input type=" datetime-local "> 这个标签是H5新增的对象方法 能把现有的时间赋值给它 但是注意:必须是 yyyy-MM-ddTHH: ...
- zabbix自定义监控项一
1.在agent端配置 1.1 添加自定义监控项 zabbix中监控项叫做item,监控项的取值方法叫做key item: Items是从agnet主机里面获取的所有数据.通常情况下我叫itme为监控 ...
- 转:敏捷方式scrum 方案
http://www.cnblogs.com/taven/archive/2010/10/17/1853386.html 现在敏捷开发是越来越火了,人人都在谈敏捷,人人都在学习Scrum和XP... ...
- ubuntu+tomcat,多环境、自动化部署脚本,git+maven+tomcat+ubuntu
1.切换到/opt/code目录,没有利用mkdir code创建code目录,新建deploy.sh 脚本文件,内容如下 projectName=""; #默认tomcat目录 ...