线程与Handler(1)

在Java中,线程有两种实现方式:1、继承Thread类 代表一个线程 ;2、实现Runable接口,代表一个线程体。

在Android当中也是如此。Android中的线程有两种。1、MainThread   主线程又叫UI线程;2、WorkerThread 即除主线程以外的其他线程。

若想利用线程对UI进行控制的话,一般只能通过UI线程,即MainThread(ProgressBar除外),这时对于一些可能会产生阻塞的操作,会导致应用无响应。因此必须把此类操作放置在WorkerThread当中,然而,WorkerThread中是不允许操作UI的。

此时,我们需要用到Handler处理器,使用消息机制来发送消息。

Handler的基本运行原理是Android开发当中最精妙也是最常用的设计。主要分为三个部分:1、Handler(处理器)2、Looper(循环器)3、MessageQueue(消息队列)

下面将用例子来说明。

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${packageName}.${activityClass}" >

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="button" />

</RelativeLayout>

MainActivity.java

package com.wyb.s02_e06_handler01;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

	private Button button;
	private Handler handler;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		button = (Button)findViewById(R.id.button);
		button.setOnClickListener(new ButtonListener());
		handler = new FirstHandler();

	}

	class ButtonListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			//当用户点击按钮时,我们创建一个Message对象,并用handler发送该对象
			Message msg=handler.obtainMessage();
			msg.what = 2;
			handler.sendMessage(msg);//传到handleMessage方法当中
			//上面一行代码将消息对象放置在消息队列中
			//1.Looper将会从消息队列中将消息队列取出
			//2.Looper将会找到与消息对象相应的Handler对象
			//3.Looper将会调用handler对象中的handlMessage(Message msg)方法,用于处理消息对象
		}

	}

	class FirstHandler extends Handler{
		//重写handleMessage方法
		@Override
		public void handleMessage(Message msg){
			int what = msg.what;
			System.out.println("what : "+what);
		}
	}

}

运行截图

在主界面放置一个按钮,当用户点击按钮时在控制台中输出Message对象的what的值。

流程如下:

1、定义一个FirstHandler 类继承Handler类,并重写handleMessage(Message msg)方法;

2、创建一个FirstHandler对象,并向上转型为Handler;

3、当用户点击按钮时,我们创建一个Message对象,并用handler发送该对象 Message msg=handler.obtainMessage();

4、设置msg中what的值为2;msg.what = 2;

5、将msg对象传入handleMessage方法当中 即将消息对象放置在消息队列中handler.sendMessage(msg);

6、Looper将会从消息队列中将消息队列取出

7、Looper将会找到与消息对象相应的Handler对象

8、Looper将会调用handler对象中的handleMessage(Message msg)方法,用于处理消息对象

9、调用handleMessage(Message msg)方法,执行System.out.println("what : "+what),在控制台中输出what的值。

线程与Handler(1)

时间: 2024-10-13 21:00:48

线程与Handler(1)的相关文章

Android线程和handler

根据视频仿照着写了个demo: package com.wyl.wylthreadtest; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.Fragment; import android.support.v7.app.ActionBarActivity; imp

Android 线程问题 handler &amp; synctask

在安卓应用中,很多耗时的工作不能放在主线程,即ui线程中进行,因为会导致线程堵塞,使得系统判断程序运行异常,所以,需要多线程来进行异步操作,Android中提供了两种多线程的实现方式,此处注意,只要涉及ui更新的都必须要在主线程中进行 1.Handler handler有两个重要的构造方式,一个是空参数的,一个是带有Looper的,用空参数的方式生成的handler是和当前的线程关联的,一般是主线程,另一种是也可以为它提供一个Looper,这样它就会绑定到Looper所在的线程上.Handler

获取内核当前执行模块和当前发生异常地址和线程异常Handler调用步骤

循环每个内核模块 统计模块大小 判断触发异常的地址属于那个模块.来确定模块 获取发生异常地址 nt!_EXCEPTION_RECORD +0x000 ExceptionCode : -2139160568 +0x004 ExceptionFlags : 0x807fa938 +0x008 ExceptionRecord : 0x00010000 _EXCEPTION_RECORD +0x00c ExceptionAddress : 0x807fa340 +0x010 NumberParamete

Android:使用Handler在线程之间通信

概述 假设一个情景,在一个应用程序中,要完成一个比较复杂.耗时较长的计算任务,如果将这个任务直接在主线程中开始,那么用户界面就会停止对用户操作的响应,而去解决这个计算任务,直到任务完成. 显然,这不是我们想要的结果.那么就需要用到多线程来解决这个问题. 但是新的问题又出现了,在C#和Android中,子线程是不能直接修改用户界面的数据的.也就是说,子线程计算出的结果,不能直接在子线程中让它显示在用户界面上.那么就需要把数据首先传递给主线程,让主线程去修改用户界面. Handler就是为了解决这个

Handler消息传递机制(四)子线程接收主线程发送的消息

package com.example.looper; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widg

安卓线程相关 HandlerThread Handler Thread Looper Message Runnable

本文由PurpleSword(jzj1993)原创,转载请注明 原文网址 http://blog.csdn.net/jzj1993 安卓主线程(UI线程)是线程不安全的:对UI控件的操作都应在主线程中完成:UI线程不应执行耗时操作,以免程序不响应(即ANR异常) 实现新线程的常用方法(注意要调用start方法启动新线程而不是run方法): 一.定义类,实现Runnable接口 class MyRunnable implements Runnable { /** * 实现接口的run方法 */ @

System、应用程序进程的Binder线程池和Handler消息循环

首先看一张Android系统启动流程图: 一个进程最重要的两项指标一个是启动了Binder线程池,也就是能够进程Binder进程间通信了.还有一个是启动了Handler消息循环,能够使用了消息循环机制. 1.那么systemserver进程是什么时候实现上面两个机制的呢?见代码: 启动了Binder线程池.是子线程池. public static final void zygoteInit(String[] argv) throws ZygoteInit.MethodAndArgsCaller

Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)

keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主要研究Handler的消息发送. 包含主线程往子线程发送消息,子线程之间互相发送消息. 一.主线程向子线程发送消息. 实现过程比較简单: 主线程发送消息到异步线程.异步线程接收到消息后在再发送一条消息给主线程. 1. 初始化主线程的Handler,用来接收子线程的消息. 2. 启动异步线程.在异步线

Android Handler主线程和一般线程通信的应用分析

Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI.解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作.如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会