Android学习笔记:Handler初步

Handler

  Handler,它直接继承自Object,一个Handler允许发送和处理Message或者Runnable对象,并且会关联到主线程的MessageQueue中。每个Handler具有一个单独的线程,并且关联到一个消息队列的线程,就是说一个Handler有一个固有的消息队列。当实例化一个Handler的时候,它就承载在一个线程和消息队列的线程,这个Handler可以把Message或Runnable压入到消息队列,并且从消息队列中取出Message或Runnable,进而操作它们。

一下是一个简单的例子。两个按钮只是测试用的。点击按钮后,将改变TextView的文字。

package com.jam.testhandler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
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;

public class MainActivity extends Activity {

	private Button button1;
	private Button button2;
	private TextView textView;
	private MyHandler handler;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		handler = new MyHandler();
		button1 = (Button) findViewById(R.id.button1);
		button2 = (Button) findViewById(R.id.button2);
		textView = (TextView) findViewById(R.id.textView);
		button1.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Thread t = new MyWorkThread();
				t.start();
			}
		});
		button2.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				TestThread tt = new TestThread();
				Thread thread = new Thread(tt);
				thread.start();
			}
		});
	}

	//集成Thread的方法
	private class MyWorkThread extends Thread {

		@Override
		public void run() {
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			String s = "String from work thread";

			//这里我没弄清楚obtainMessage和new Message的区别。
//			Message msg = handler.obtainMessage();
			Message msg = new Message();

			msg.obj = s;
			handler.sendMessage(msg);
		}

	}

	//实现Runnable
	//注意Runnable代表线程体而不是一个线程
	private class TestThread implements Runnable {

		@Override
		public void run() {
			Runnable r = new Runnable() {

				@Override
				public void run() {
					System.out.println("Thread的名字-->" + Thread.currentThread().getName());
				}
			};

			handler.post(r);
		}

	}

}

Handler 发送的 message 到队列中后,Looper 拿到后会返回到发送消息的Handler中处理。

Handler拿到后,在这个例子中,由于Handler是在主线程当中,所以这个机制可以另其他线程处理的东西拿到Handler中,再进行UI的修改。

以下是另一种用法,在新的线程中使用Handler

package com.example.testhandler2;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
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;

public class MainActivity extends Activity {

	private Button button;
	private TextView textView;
	private Handler handler;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		button = (Button) findViewById(R.id.button);
		textView = (TextView) findViewById(R.id.textView);

		button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Message msg = new Message();
				msg.what = 50;
				handler.sendMessage(msg);
			}
		});

		WorkerThread workerThread = new WorkerThread();
		workerThread.start();
	}

	private class WorkerThread extends Thread {

		@Override
		public void run() {
			Looper.prepare();
			handler = new Handler() {

				@Override
				public void handleMessage(Message msg) {
					Log.d("msg", "" + msg.what);
				}

			};
			Looper.loop();
		}

	} 

}

在点击按钮后,使用handler发送数据,在另一个线程中把数据取出来。

在子线程创建使用Handler要注意固定用法:

先准备Loop

Looper.prepare()

复写Handler的方法handleMessage

Looper.loop

注意:

Thread代表线程

Runnable代表线程体不是一个线程,线程体传入线程才能用

Handler在哪个线程生成,Looper就在哪个线程

Handler.post()方法 将一个Runnable放入Message的callback中,然后传入消息队列。

Loop取出带有Runnable的Message后,判断是否有callback属性,有则执行handleCallback(Message msg),然后在此方法中执行run方法,没有new一个Thread,一般在这个run()方法中写入需要在UI线程上的操作。

用这样的机制可以弥补没有语句块的缺憾。(oc语言)

另外,有两遍关于Handler很好的博文:

Android--多线程之Handler

Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等

时间: 2024-11-02 06:50:25

Android学习笔记:Handler初步的相关文章

Android学习笔记--Handler用法总结

转自:一叶知秋的博客 http://blog.sina.com.cn/s/blog_77c6324101016jp8.html 一.Handler的定义: Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用.比如 (1) 可以用handler发送一个message,然后在handler的线程中来接收.处理该消息,以避免直接在UI主线程中处理事务导致影响UI主线程的其他处理工作,Android提供了Handler作为主线程和子线程的纽带: (2) 也可以

Android学习笔记——Handler实例

Handler的实质就是异步消息处理. 实例一: Handler的基本用法 XML布局代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:orientati

Android学习笔记-Handler的使用

点击Start按钮,每隔3秒在Logcat里打印一句话     <Button          android:id="@+id/startButton"         android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:text="Start"/>     <But

Android学习笔记48:使用Handler实时更新UI

在Android中,主要通过MessageQueue.Looper和Handler三个类来实现Android应用程序的消息处理.其中,MessageQueue类用来描述消息队列:Looper类用来创建消息队列,以及进入消息循环:Handler类则用来发送消息和接收消息. 本文将主要对Handler进行简要介绍,并以一个简单的实例演示如何使用Handler实时更新UI. 1.Handler的作用 在Android中,当应用程序启动时,Android系统会启动一个主线程(也被称为UI线程),主要用来

udacity android 学习笔记: lesson 4 part b

udacity android 学习笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 联系:1307316一九六八 声明:本文採用下面协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. tips:https://code.csdn.net/titer1/pat_aha/blob/master/Mar

Android学习笔记(四九):通过Content Provider访问数据

在上次笔记中,我们编写了自己的Provider,这次笔记,我们将通过Content Provider的Uri接口对数据进行访问,重写Android学习笔记(四二)中例子.在这里我们不在充分描述相关UI如何编写,可以到笔记(四二)中详细查看,重点讲述如何实现数据的访问. 读取信息 读取信息方式,在笔记(四七)中已经介绍,代码如下 private voidread(){     /* 通过managedQuery读取,第1参数表示URI, 第2参数表示所需读取的信息,第3个参数是限制条件,类似SQL

Android学习笔记二

17. 在ContentProvider中定义的getType()方法是定义URI的内容类型. 18. SQLiteDatabase类中的insert/delete/update/query方法其实也挺好用的,我在EquipmentProvider类中做了实现 19. Android专门有个单元测试项目(Android Test Project),在这个项目中,可以新建一个继承AndroidTestCase类的具体测试类来单元测试某个功能.我新建了一个AndroidTestProject项目,在

十一、Android学习笔记_AsyncQueryHandler的应用

研究AsyncQueryHandler这个类的时候遇到了几个重要的不清楚的知识点 1. Handler与Thread,Looper的关系 2. HandlerThread是干什么用的 3. ThreadLocal类是干什么用的 Handler 主要是用来发送和处理消息,但是发送了消息后,消息是怎么传递的呢?这就是Looper的作用了,每个Handler中都会有一个Looper对象,如果在创建Handler的时候不指定,系统就会默认将当前线程的Looper绑定到Handler上,Looper对象中

Android学习笔记(五三):服务Service(下)- Remote Service

之前所谈的Service属于Local Service,即Service和Client在同一进程内(即同一application内),Service的生命周期服从进程的生命周期.在实际应用上,有时希望Service作为后台服务,不仅被同一进程内的activity使用,也可被其他进程所使用,针对这种情况,需要采用bindService,也就是Remote Service的方式. 在Android中,不同app属不同进程(process),进程是安全策略的边界,一个进程不能访问其他进程的存储(例如采

Android学习笔记二十之Toast吐司、Notification通知、PopupWindow弹出窗

Android学习笔记二十之Toast吐司.Notification通知.PopupWindow弹出窗 Toast吐司 Toast吐司是我们经常用到的一个控件,Toast是AndroidOS用来显示消息的一种机制,它与Dialog不同,Toast不会获取到焦点,通常显示一段时间之后就会自动消失,下面我们来介绍Toast的几种常用方式: 第一种,默认显示方式,也是最常用的方式: Toast.makeText(MainActivity.this, "这是默认的显示方式", Toast.LE