Android中的Handler与HandlerThread浅析

一、Handler

Handler在android里负责发送和处理消息。它的主要用途有:

  1)按计划发送消息或执行某个Runnanble(使用POST方法);
  2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程)
   默认情况下,Handler接受的是当前线程下的消息循环实例(使用Handler(Looper looper)、Handler(Looper  looper, Handler.Callback callback) 可以指定线程),同时一个消息队列可以被当前线程中的多个对象进行分发、处理(在UI线程中,系统已经有一个Activity来处理了,你可以再起若干个 Handler来处理)。在实例化Handler的时候,Looper可以是任意线程的,只要有Handler的指针,任何线程也都可以 sendMessage。Handler对于Message的处理不是并发的。一个Looper 只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的(handleMessage()方法里不应该有耗时操作,可以将耗时操作放在其他线程执行,操作完后发送Message(通过sendMessges方法),然后由handleMessage()更新UI)。

看一个简单的例子:

Example1:ThreadDemos

package com.example.threaddemos;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends Activity {
	private static final String TAG = "yxf";
	private int count = 0;
	private Handler mHandler;
	private Runnable mRunnable = new Runnable() {
		public void run() {
			// 为了方便 查看,我们用Log打印出来
			Log.e(TAG, "Runnable thread: " + Thread.currentThread().getId() + " " + count);
			count++;
			//Runnable所在线程是主线程,所以可以在这里面修改UI.
			setTitle("" + count);
			// 每2秒执行一次
			mHandler.postDelayed(mRunnable, 2000);
		}
	};
 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		Log.e(TAG, "Main Thread:" + Thread.currentThread().getId() + " " + count);
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 通过Handler启动线程
		mHandler = new Handler();
		mHandler.post(mRunnable);
	}

	@Override
	protected void onDestroy() {
		// 将线程与当前handler解除绑定。如果注释掉该行代码,会发现即使退出该Acitivity也会继续执行线程的run().
		mHandler.removeCallbacks(mRunnable);
		super.onDestroy();
	}
}

二、 HandlerThread

HandlerThread继承于Thread,所以它本质就是个Thread。与普通Thread的差别就在于,它有个Looper成员变量。这个Looper其实就是对消息队列以及队列处理逻辑的封装,简单说就是 消息队列+消息循环。

当我们需要一个工作者线程,而不是把它当作一次性消耗品,用过即废弃的话,就可以使用它。

Example2:HandlerThreadDemos

package com.example.handlerthreaddemos;

import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;

public class MainActivity extends Activity {
	private static final String TAG = "bb";     
	private int count = 0;     
	private Handler mHandler ;     
	private Runnable mRunnable = new Runnable() {     
	    public void run() {     
	        //为了方便 查看,我们用Log打印出来     
	        Log.e(TAG, "Runnable Thread: " + Thread.currentThread().getId() + " " +count);     
	        count++;
	        //如果不注释掉setTitle()会报错,只有主线程才可以修改UI.
	        //setTitle("" +count);     
	        //每2秒执行一次     
	        mHandler.postDelayed(mRunnable, 2000);     
	    }     
	};     
	
	@Override     
	public void onCreate(Bundle savedInstanceState) {     
	    Log.e(TAG, "Main Thread: "+Thread.currentThread().getId() + " " +count);     
	    super.onCreate(savedInstanceState);     
	    setContentView(R.layout.activity_main);      
	    //通过Handler启动线程     
	    HandlerThread handlerThread = new HandlerThread("threadone");   
	    handlerThread.start();
	    //mHandler用handlThread的looper初始化,表示该handler是handlerThread线程下的handler,而不是主线程的handler.
	    mHandler =  new Handler(handlerThread.getLooper());   
	    mHandler.post(mRunnable);     
	}     
	
	@Override     
	protected void onDestroy() {     
	    //将线程与当前handler解除   
	    mHandler.removeCallbacks(mRunnable);     
	    super.onDestroy();     
	}     
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值