編輯:關於Android編程
異步消息處理線程是指線程啟動後會進入一個無限循環,每循環一次,從內部的消息隊列裡面取出一個消息,並回調相應的消息處理函數。一般在任務常駐,比如用戶交互任務的情況下使用異步消息處理線程。
之前在Android中Handler原理裡面研究過android裡實現異步消息處理線程的方式,基本邏輯如圖所示
今天就用java將其簡單的模擬出來加深印象,下面的類圖是用工具導出的,不太正規,不過能大概看出類之間的關系
Message類:消息類<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">
public class Message {
public int what;
public Object obj;
public Handler target;
}
Looper類:用來將普通的線程變為異步消息循環的類,維護了一個消息隊列。每個線程有且僅有Looper對象,且是線程封閉的,每個線程都有自己的一份拷貝。
public class Looper {
private MessageQueue queue;
private static final ThreadLocal sThreadLocal = new ThreadLocal();
public Looper() {
queue = new MessageQueue();
}
public static void prepare(){
if (sThreadLocal.get() != null) {
throw new RuntimeException(Only one Looper can be created per thread);
}
sThreadLocal.set(new Looper());
}
public static Looper myLooper() {
return sThreadLocal.get();
}
public static MessageQueue myQueue() {
return myLooper().queue;
}
public static void loop(){
while(true){
Message msg = myQueue().deQueueMessage();
if (msg == null) {
continue;
}else {
msg.target.dispatchMessage(msg);
}
}
}
}
MessageQueue 類:消息隊列,按照先進先出的原則從隊列裡面取出消息Message
public class MessageQueue {
private Queue queue = new LinkedList();
public synchronized void enqueueMessage(Message msg){
queue.offer(msg);
}
public synchronized Message deQueueMessage(){
if (queue.isEmpty()) {
return null;
}
return queue.poll();
}
}
Handler類:一般不直接操作隊列,通過handler往消息隊列裡面加入Message對象。並且暴露handlerMessage方法讓程序員重寫達到自己的處理的目的。
public class Handler {
private MessageQueue queue;
public Handler(){
queue = Looper.myQueue();
}
public void sendMessage(Message msg){
msg.target = this;
queue.enqueueMessage(msg);
}
public void dispatchMessage(Message msg) {
handleMessage(msg);
}
public void handleMessage(Message msg){}
}
Main 類:程序運行的啟動類
public class Main {
public static void main(String[] args) {
Looper.prepare();
TestInterface test = new Test();
test.onCreate();
Looper.loop();
}
}
TestInfo接口:規范了測試的一個接口
public interface TestInterface {
void onCreate();
}
Test 類:暴露出來的唯一的需要程序員填寫代碼的類我們在一個定時器裡面每一秒鐘發送一條消息到主線程,並將其顯示出來
public class Test implements TestInterface{
private static SimpleDateFormat sdf=new SimpleDateFormat(HH:mm:ss);
private Handler handler = new Handler(){
public void handleMessage(Message msg) {
if (msg.what == 1) {
System.out.println(handler---> + (String)msg.obj);
}
};
};
@Override
public void onCreate() {
new Timer().schedule(new TimerTask() {
@Override
public void run() {
Message msg = new Message();
msg.what = 1;
msg.obj = test + sdf.format(new Date());
handler.sendMessage(msg);
}
}, 0,1000);
}
}
測試結果如下:
handler—>test21:32:43
handler—>test21:32:44
handler—>test21:32:45
handler—>test21:32:46
handler—>test21:32:47
handler—>test21:32:48
handler—>test21:32:49
…….
1 -- Volley簡介Android開發團隊也是意識到了有必要將HTTP的通信操作再進行簡單化,於是在2013年Google I/O大會上推出了一個新的網絡通信框架&
gridview作為android開發中常用的組件,其功能十分強大。但是,我們有時候有很多特殊的需求,需要在其基礎上進行改造。有時候會有移動gridView中item位置
華為榮耀暢玩5x於去年10月份上市至今,是華為的中低端手機中口碑較好的一款,而華為榮耀5c是今年4月份剛剛上市的,剛上市就有花粉在問華為榮耀5x和5c哪個好
最近無意中發現了QQ群有查看附近的人的效果,感覺挺棒的,約炮神器有木有! 效果這麼酷,網上有沒有呢?木有!好吧,作為程序猿還是老老實實苦逼的撸吧。1.概述 老規矩,先上