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中的文件多线程下载模块,支持自定义线程数.断点续传.下载 ...
随机推荐
- Python与数据库[1] -> 数据库接口/DB-API[1] -> MySQL 适配器
MySQL适配器 / MySQL Adapter MySQL是一种关系型数据库,下面主要介绍利用如何利用Python的MySQL适配器来对MySQL进行操作,其余内容可参考文末相关阅读. 1 MySQ ...
- #424 Div2 C
#424 Div2 C 题意 给出 k 个分数,初始分数未知,按顺序把这 k 个分数加到初始分数上,已知 n 个加入分数后的结果(无序),问初始分数有多少种可能. 分析 也就是说这 n 个结果,它们之 ...
- 洛谷——P1067 多项式输出
P1067 多项式输出 题目描述 一元 n 次多项式可用如下的表达式表示: 其中,aixi称为 i 次项,ai 称为 i 次项的系数.给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该 ...
- luogu P1373 小a和uim之大逃离
题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个 ...
- 个人博客 V0.0.3 版本 ...
早就想弄个人博客网站,一直拖到现在...事情总是忙不完的,想能力提升的快,只能挤时间多练多写了,Keep On Unsleeping 以后原创的笔记都会在自己的博客网站写,博客园和简书就用来转发文章了 ...
- Uprobes: userspace probes >= Linux 3.5
https://lwn.net/Articles/499190/ https://github.com/andreoli/fulltrace Prominent features in Linux 3 ...
- java 后台将base64字符串保存为图片
直接上代码: import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; impo ...
- ylb: 数据库操作方法基础
ylbtech-SQL Server:SQL Server-数据库操作方法基础 数据库操作方法基础. ylb: 数据库操作方法基础 返回顶部 ----------试图操作(view)--------- ...
- 在pos:a元素不设定宽度的情况下,他的最大宽度是受父元素的宽度所限制的。
<div style="width:80px;height:50px;position:relative;left:50px;"> <ul style=" ...
- ElasticSearch 监控单个节点详解
1.介绍 集群健康 就像是光谱的一端——对集群的所有信息进行高度概述. 而 节点统计值 API 则是在另一端.它提供一个让人眼花缭乱的统计数据的数组,包含集群的每一个节点统计值. 节点统计值 提供的统 ...