Hander Looper 学习
来源:互联网 发布:java erp源码 编辑:程序博客网 时间:2024/06/06 23:17
1.
l
l
l
l
l
l
l
l
l
2. 範例之一:Looper物件之角色
Looper類別用來管理特定線程內物件之間的訊息交換(Message Exchange)。你的應用程式可以誕生許多個線程,或稱執行緒(Thread)。而一個線程可以誕生許多個物件,這些物件之間常常需要互相交換訊息。如果有這種需要,您可以替線程誕生一個Looper類別之物件,來擔任訊息交換的管理工作。Looper物件會建立一個MessageQueue資料結構來存放各物件傳來的訊息(包括UI事件或System事件等)。如下圖:
//-----Looper_01範例-----
package com.misoo.kx04;
import android.app.Activity;
import android.graphics.Color;
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.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
public class ac01extends Activityimplements OnClickListener{
//------------------------------------------------------
class EventHandlerextends Handler
}
//-------------------------------------------------------
說明:
就呼叫Looper類別的靜態myLooper()函數,以取得目前線程裡的Looper物件之參考值。
指令:mHandler =new EventHandler(looper);
誕生一個EventHandler之物件來與Looper溝通。Activity等物件可以藉由EventHandler物件來將訊息傳給Looper,然後放入MessageQueue裡;EventHandler物件也扮演Listener的角色,可接收Looper物件所送來的訊息。如下圖:
指令:Message m = mHandler.obtainMessage(1, 1, 1, obj);
先誕生一個Message物件,並將資料存入次物件裡。
指令:mHandler.sendMessage(m);
就透過mHandler物件而將訊息m傳給Looper,然後放入MessageQueue裡。
此時,Looper物件看到MessageQueue裡有訊息m,就將它廣播出去,mHandler物件接到此訊息時,會呼叫其handleMessage()函數來處理之,於是輸出"This my message!"於畫面上,如下:
3. 範例之二:由別的線程送訊息到主線程的Message Queue
//-----Looper_02範例-----
package com.misoo.kx04;
import android.app.Activity;
import android.graphics.Color;
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.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
public class ac01extends Activityimplements OnClickListener{
//------------------------------------------------------
class EHandlerextends Handler {
//------------------------------------------------------
class myThreadextends Thread{
}
//-------------------------------------------------------
Android會自動替主線程建立Message Queue。在這個子線程裡並沒有建立Message Queue。所以,myLooper值為null,而mainLooper則指向主線程裡的Looper物件。於是,執行到指令:
mHandler = newEHandler(mainLooper); 此mHandler屬於主線程。
就將m訊息存入到主線程的Message Queue裡。mainLooper看到Message Queue裡有訊息,就會處理之,於是由主線程執行到mHandler的handleMessage()函數來處理訊息。此程式輸出畫面為:
4. 結語:
l
l
---- END---
创建的工作线程默认是没有消息循环和消息队列的,如果想让该线程具有消息队列和消息循环,需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环。如下例所示:
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
HandlerThread 可用于方便的创建一个新线程,然后获得一个looper,以便指定后续的handler在新的线程里执行。 而不用自己再去写一个线程类,然后创建looper等操作。
示例:
HandlerThread thread = new HandlerThread("ServiceStartArguments",Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
转至:http://www.android1.net/Topic.aspx?BoardID=11&TopicID=625
- Hander Looper 学习
- Hander looper messageQueue
- WebService AXIS 学习笔记
- android NDK 学习 入门
- FragmentTabHost 与 Fragment 学习
- javascript 深入 学习
- QTP 学习笔记
- C++ 学习 二
- 关于 YII 学习 的文章 连接
- Flash AS3 学习1 - 按钮
- Flash AS3 学习2 - 倒计时
- Flash AS3 学习3 - 右键菜单
- Flash AS3 学习7 - 计时器
- Flash AS3 学习11 - 拖动
- 详述Android Looper和Hander
-  
- 兴趣学习: 信息熵 ---- 《数学…
-
- 创业者如何打动投资者——投资者关注…
- Linux基础回顾(2)——Linux系统分区二三事
- 各国网络标识码表 MCC MNC表
- 如何选择一个合适的创业公司加入
- 深入理解Android消息处理系统——Loo…
- Hander Looper 学习
- I/O流系统关系图
- 什么是IntentService? (本文转自h…
- 移动开发路径之运营推广
- 创业前应先做出一个好的非盈利产品
- 免输入密码,自动登录远程linux服务器
- Spinner控件简单应用
- 有关时间管理--李开复
- android EditView 文本密码显示与…