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的方式的更多相关文章

  1. Android多线程更新UI的方式

    Android下,对于耗时的操作要放到子线程中,要不然会残生ANR,本次我们就来学习一下Android多线程更新UI的方式. 首先我们来认识一下anr: anr:application not rep ...

  2. Android中JNI编程的那些事儿(1)

    转:Android中JNI编程的那些事儿(1)http://mobile.51cto.com/android-267538.htm Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须 ...

  3. Android中H5和Native交互的两种方式

    Android中H5和Native交互的两种方式:http://www.jianshu.com/p/bcb5d8582d92 注意事项: 1.android给h5页面注入一个对象(WZApp),这个对 ...

  4. android Handler更新UI

    android中经常需要更新界面某个元素的值,但是在主线程中是不可以直接更新主线程的值.这里推荐通过handler机制来更新值. 一Handler的定义: 主要接受子线程发送的数据, 并用此数据配合主 ...

  5. Android多线程编程<二>Handler异步消息处理机制之Message

      Message(消息):       一. Message的字段:    在Android中,Message作为线程之间(主要是子线程和UI主线程之间)数据交换的载体,通过Handler去传递.它 ...

  6. Android开发 ---多线程操作:Handler对象,消息队列,异步任务下载

    效果图: 1.activity_main.xml 描述:定义了六个按钮 <?xml version="1.0" encoding="utf-8"?> ...

  7. [Android学习笔记]Android中多线程开发的一些概念

    线程安全: 在多线程的情况下,不会因为线程之间的操作而导致数据错误. 线程同步: 同一个资源,可能在同一时间被多个线程操作,这样会导致数据错误.这是一个现象,也是一个问题,而研究如何解决此类问题的相关 ...

  8. Android 快速切换到主线程更新UI的几种方法

    此最近看了网上,在子线程更新UI的方法,说法很多,但都不是很全面.在此我争取做到总结的全面一些,希望以后对自己,对大家都有一些帮助. 方法一: view.post(Runnable action) 假 ...

  9. Android中多线程下载列表的封装实现(含进度反馈)

    来源:http://blog.csdn.net/u011638883/article/details/17347015 实现了一下Android中的文件多线程下载模块,支持自定义线程数.断点续传.下载 ...

随机推荐

  1. ESXI和vSphere的安装配置-实现一台电脑硬件虚拟化为两台

    本篇文章包含以下几个部分: 1EXSI软件和vSphere软件的安装 2在vSphere上安装虚拟系统 3对虚拟系统通过配置实现硬件虚拟化,实现硬件直通 1.EXSI安装 通过网上下载EXSI ISO ...

  2. JDBC二部曲之_入门

    JDBC 1 什么是JDBC? JDBC(Java DataBase Connectivity),即Java数据库连接!也就是说,Java程序员可以使用JDBC API来操作数据库. 最早JDBC是J ...

  3. HDU 6395 2018 Multi-University Training Contest 7 (快速幂+分块)

    原题地址 Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)T ...

  4. 前端中 width 的获取

    这篇文章其实是在了解 viewport 的过程中发现这些概念容易混淆做了个小小的总结.viewport的首要关键是宽度的获取,宽度的计算有下面几个属性和方法: clientWidth offsetWi ...

  5. Guess Number Higher or Lower II -- LeetCode

    We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ...

  6. ARC 098 D - Xor Sum 2

    Problem Statement There is an integer sequence A of length N. Find the number of the pairs of intege ...

  7. [POI2012]A Horrible Poem

    题目大意: 给定一个长度为$n(n\leq5\times10^5)$的字符串$S$,$q(q\leq2\times10^6)$组询问,每次询问子串$S_{[l_i,r_i]}$最小循环节. 思路: 若 ...

  8. Mobius反演与积性函数前缀和演学习笔记 BZOJ 4176 Lucas的数论 SDOI 2015 约数个数和

    下文中所有讨论都在数论函数范围内开展. 数论函数指的是定义域为正整数域, 且值域为复数域的函数. 数论意义下的和式处理技巧 因子 \[ \sum_{d | n} a_d = \sum_{d | n} ...

  9. Ubuntu 16.04/CentOS 6.9安装Apache压力(并发)测试工具ab

    说明: ab工具已经在Apache中包含,如果不想安装Apache,那么可以使用下面方法单独安装. 安装: Ubuntu: sudo apt-get install apache2-utils Cen ...

  10. python定时执行方法

    1  time.sleep import time for i in range(5): print(i) time.sleep(10) 2 用shed import time import sche ...