读书人

Android线程形式(handlerthreadl

发布时间: 2012-07-02 17:46:22 作者: rapoo

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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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(){@Overridepublic 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 程模式简介

读书人网 >Android

热点推荐