Android理论梳理-No1异步处理之Handler相关机制

1 Handler的基本概念:

什么是handler?

Handler是安卓系统的一种回调机制。

handler的作用?

他的作用是用于不同线程之间的通讯。一是可以用于子线程与UI线程的数据通信,因为只有UI线程可以更新UI,子线程如果想要更新界面就需要用Handler通过发送Message来更新UI,而UI线程在handlerMessage方法中处理传过来的Message数据。二是可以用于Handler绑定的线程延迟发送消息。

2 那么为什么只有UI线程才能更新UI呢?

主要是为了解决多线程并发的问题。如果所有的线程都能更新UI,为了解决并发问题,线程会对UI对象进行加锁,那可能出现死锁现象导致界面卡住。另外只有UI线程进行更新也让设计和编程更简单。

3 Handler、Looper和MessageQueue之间的关系?

Handler负责向绑定的Looper发送消息。而MessageQueue是Looper内部的一个消息队列容器,Looper用MessageQueue消息队列来装载这些消息,并通过一个死循环方法Looper.loop从消息队列中取出消息并通过dispatchMessage方法把取出的消息发送给handlerMessage方法来进行处理。

4 能在子线程直接更新UI吗?

在网上能看到很多文章说android里子线程不能刷新UI。其实线程能否刷新UI的关键在于ViewRoot是否属于该线程。而实际上子线程在特定情况下是可以刷新UI的。ViewRoot实例要通过ViewRootImpl()方法来创建,在Activity.onResume前,ViewRoot实例没有建立,所以没有ViewRoot.checkThread检查。所以在onCreate方法的早期是可以在子线程更新UI的。

如下面例子:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

public
class
MainActivity extends
Activity {

TextView textView1;

@Override

protected
void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

textView1 = (TextView) findViewById(R.id.textView1);

new
Thread(
new Runnable() {

public
void
run() {

textView1.setText("子线程更新UI");

}

}).start();

}

}

参考资料:

android学习笔记(60)使用Bundle在Activity之间文换教接

android学习笔记(59) android开发启动和关闭activity

android学习笔记(58)Activity学习过程

更多android开发教程

时间: 2024-11-17 06:04:04

Android理论梳理-No1异步处理之Handler相关机制的相关文章

(原)Android理论梳理-No1异步处理之Handler相关机制

1 Handler的基本概念: 什么是handler? Handler是安卓系统的一种回调机制. handler的作用? 他的作用是用于不同线程之间的通讯.一是可以用于子线程与UI线程的数据通信,因为只有UI线程可以更新UI,子线程如果想要更新界面就需要用Handler通过发送Message来更新UI,而UI线程在handlerMessage方法中处理传过来的Message数据.二是可以用于Handler绑定的线程延迟发送消息. 2 那么为什么只有UI线程才能更新UI呢? 主要是为了解决多线程并

Android异步更新UI的方式之使用Handler消息传递机制

由于性能要求,android要求只能在UI线程中更新UI,要想在其他线程中更新UI,给大家介绍一种方式:使用Handler消息传递机制. 下面用这种方式更新一个TextView: package com.example.runonuithreadtest; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.widget.TextView; public

深入解析Android中Handler消息机制

Android提供了Handler 和 Looper 来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(MessageExchange).Handler消息机制可以说是Android系统中最重要部分之一,所以,本篇博客我们就来深入解析Android中Handler消息机制. Handler的简单使用 为什么系统不允许子线程更新UI 因为的UI控件不是线程安全的. 如果在多线程中并发访问可能会导致UI控件处于不可预期的状态,那为什么不对UI控件的访

android从网络上异步加载图像

研究了android从网络上异步加载图像: (1)由于android UI更新支持单一线程原则,所以从网络上取数据并更新到界面上,为了不阻塞主线程首先可能会想到以下方法. 在主线程中new 一个Handler对象,加载图像方法如下所示 [java] view plaincopyprint? private void loadImage(final String url, final int id) { handler.post(new Runnable() { public void run()

Android Handler处理机制 ( 三 ) ——Handler,Message,Looper,MessageQueue

在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长时间的任务后做出相应的通知 handler基本使用: 在主线程中,使用handler很简单,new一个Handler对象实现其handleMessage方法,在handleMessage中 提供收到消息后相应的处理方法即可,这里不对handler使用进行详细说明,在看本博文前,读者应该先掌握handler的基本使用,我这里主要深入描述handler的内部机制 .现在我们首先就有一个问题,我们使用myThread

Android编程之图片(异步)加载类

应某人之请,写一篇关于图片加载类.其实,网上有很多这样的类,而且比较推崇的是来自google中开源中的一篇.他写的比较好了,而且注意了内存优化,下面贴出它的图片下载类: [java] view plaincopy /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not 

Android Handler消息机制

在上一篇文章<Android AsyncTask异步任务>中我们介绍了如何使用AsyncTask异步处理网络通信和UI更新.在本文中将使用Handler消息机制来异步处理网络通信和UI更新. Google参考了Windows的消息机制,在Android系统中实现了一套类似的消息机制.学习Android的消息机制,有几个概念(类)必须了解: 1.Message 消息,理解为线程间通讯的数据单元.例如后台线程在处理数据完毕后需要更新UI,则可发送一条包含更新信息的Message给UI线程. 2.M

Android开发:Handler异步通信机制全面解析(包含Looper、Message Queue

前言 最近刚好在做关于异步通信的需求,那么,今天我们来讲解下Android开发中的Handler异步通信传递机制(包括Looper.Message Queue) 目录 定义 Android提供的一套消息传递机制 作用 用于实现子线程对UI线程的更新,实现异步消息的处理: - 在新启动的线程中发送消息 - 在主线程中获取并处理信息 为什么要用Handler 在安卓开发中: - 为了保证Android的UI操作是线程安全的,Android规定了只允许UI线程修改Activity里的UI组件: - 但

android开启线程,异步处理数据实例

package com.example.sywang2; import com.zds.os.R; import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.TextView; publ