当前位置: 代码迷 >> Android >> Android线程形式(handler,thread,looper)
  详细解决方案

Android线程形式(handler,thread,looper)

热度:144   发布时间:2016-05-01 20:01:19.0
Android线程模式(handler,thread,looper)
在 Android 框架?,一個應用套件(Application Package)通常含有多個Java ?(Class),這些?可以在同一個進程(Process)?執?;也可以在?同的進程?執?。
每一個進程在誕生時,都會誕生一個主線程(Main Thread),以及誕生一個Looper?的對象和一個MQ(Message Queue)資?結構。每當主線程作完事情,就會去執?Looper?。此時,?斷地觀察MQ的動態。
主線程最主要的工作就是處?UI畫面的事件(Event),每當UI事件發生時,Android框架會丟信息(Message)到MQ?。主線程看到MQ有新的信息時,就取出信息,然後依據信息內容而去執?特定的函?。執?完畢,就再繼續執?Looper?,?斷地觀察MQ的動態。
本文章通过3个例子来说明子线程和主线程之间的通信。
一:通过handler在主线程之内进行通信。
mBtn1.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View v) {				Looper myL = Looper.myLooper();				Looper mainL = Looper.getMainLooper();				String obj = "";				mH = new MyHandler(mainL);				if(myL == mainL) {					obj = "myLooper == MainLooper";				} else {					obj = "myLooper != MainLooper";				}				Message msg = mH.obtainMessage(1, obj);				mH.sendMessage(msg);			}		});

Obj值为"myLooper == MainLooper",因为该线程属于主线程,所以获取的当前线程的Looper对象和主线程的Looper对象时同一个。
二:子线程发送message通知主线程更新UI操作
mBtn1.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View v) {				mT = new MyThread();				mT.start();			}		});		public void run() {			Looper myL = Looper.myLooper();			Looper mainL = Looper.getMainLooper();			String obj = "";			mH = new MyHandler(mainL);			if(myL == null) {				obj = "myLooper is null";			} else if(myL == mainL){				obj = "myLooper == MainLooper";			} else {				obj = "myLooper != MainLooper";			}			Message msg = mH.obtainMessage(1, obj);			mH.sendMessage(msg);		}

Obj值为myLooper is null,因为每一個進程在誕生時,都會誕生一個主線程(Main Thread),以及誕生一個Looper?的對象和一個MQ(Message Queue)資?結構。而子线程不会自动创建,除非自己创建,创建过程看例子三。
三:子线程和主线程之间交互
mBtn1.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View v) {				String obj = "main thread";				Message msg = mH.obtainMessage(1, obj);				mH.sendMessage(msg);			}		});		public void run() {			Looper.prepare();			mH = new Handler(){				@Override				public void handleMessage(Message msg) {					Log.e("XXX", msg.obj.toString());					Looper myL = Looper.myLooper();					Looper mainL = Looper.getMainLooper();					String obj = "";					mH = new MyHandler(mainL);					if(myL == mainL){						obj = "myLooper == MainLooper";					} else {						obj = "myLooper != MainLooper";					}					Message msg1 = mH.obtainMessage(1, obj);					mH.sendMessage(msg1);				}			};			Looper.loop();		}

为子线程创建自己的Looper对象过程如下:
Looper.prepare();
自己的操作
Looper.loop();

HandlerThread .
这个类可以简化Thread,因为它里面定义了looper变量

测试代码见附件

以上文章参考高焕堂Android系统架构详细讲解-Android 線程模式简介
  相关解决方案