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. Ubuntu14.04配置VIM与GVIM 高亮、跳转与变量函数列表

    一.环境:刚安装好的Ubuntu14.04,本文只能保证 在Ubuntu下能达到效果. 二.安装GVim. sudo apt-get update sudo apt-get install vim-g ...

  2. [jquery] 给动态生成的元素绑定事件 on方法

    用底下的方法尝试了好多次都失败 $('.del').on('click',function(){ alert('aa'); })// 失败!! 终于在准备放弃前看到一篇博文说的方法 $(documen ...

  3. Codeforces 1025D Recovering BST

    这个题被wa成傻逼了.... ma[i][j]表示i,j能不能形成一条直接作为排序二叉树的边,n^3更新维护ma即可,按说应该是要爆复杂度的,数据玄学吧.. #include<iostream& ...

  4. 【BZOJ3524】Couriers

    题面 Description 给一个长度为\(n\)的序列\(a\).\(1\le a[i]\le n\). \(m\)组询问,每次询问一个区间\([l,r]\),是否存在一个数在\([l,r]\)中 ...

  5. 操作系统/etc/hosts文件配置

    windows对应 C:\Windows\system32\drivers\etc\hosts linux: /etc/hosts Hosts - The static table lookup fo ...

  6. 蛋疼的VS2010 tab group

    http://superuser.com/questions/232031/why-does-my-visual-studio-2010-default-to-a-horizontal-windows ...

  7. Creating and Flashing UBIFS with MTD Utils

    转:http://wiki.atlas-embedded.com/index.php?title=Creating_and_Flashing_UBIFS_with_MTD_Utils Contents ...

  8. 从M个数中随机等可能的取出N个的问题

    从0到m-1这m个数中随机取出n个(n<=m) 要求每个数被取到的可能性相等. 第一个方法是把这m个数丢到一个List里面 然后用nextInt(list.size())来产生随机数 然后把li ...

  9. Visio文件转EPS文件

    Visio转eps by gaihf@水木 看了前人写的关于Visio转EPS的文章,但是实践过程中还是碰到几个棘手的问题.现在这些问题终于解决了,把自己的一点体会分享给大家. 很多人习惯用Visio ...

  10. 谷歌安卓UI自动化测试策略

    中文翻译版: 为了使大家确信"应做单元测试,就一定能做单元测试",谷歌测试工程师Mona El Mahdy专门写了一篇博客,提出了几种执行安卓应用用户界面单元测试的方法.Mahdy ...