編輯:關於Android編程
Android UI是線程不安全的,如果在子線程中嘗試進行UI操作,程序就有可能會崩潰。解決的方案應該是創建一個Message對象,然後借助Handler發送出去,之後在Handler的handleMessage()方法中獲得剛才發送的Message對象,然後在這裡進行UI操作就不會再出現崩潰了。
這種處理方式被稱為異步消息處理線程。簡單的說就是在子線程中實現更新UI操作。
關於Handler的使用包括兩種:
從子線程(worker線程)中向主線程(UI線程)發送消息,在主線程中處理消息; 從主線程(UI線程)中向子線程(worker線程)發送消息,在子線程中處理消息。主要步驟如下:
在主線程自定義Handler(非抽象類)子類並實現handleMessage(Message)
方法; 在worker Thread當中通過Handler對象的sendMessage(Message)
方法發送Message; Handler對象將Message放在消息隊列MessagQueue中; Looper將Message從消息隊列中取出,並找到對應的Handler對象。 Looper調用Handler對象的handleMessage(Message)
方法處理Message。
其中,我們只要完成1,2兩步,其余由系統完成。
主要代碼如下:
//在main Thread中創建Handler對象
handler = new MyHandler();
//創建worker Thread
new Thread(new Runnable() {
@Override
public void run() {
//創建消息對象
Message message = handler.obtainMessage();
message.obj = 我是從worker Thread向main Thread發送的消息;
//發送消息對象
handler.sendMessage(message);
}
}).start();
其中,MyHandler類如下:
class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
Log.d(result:,Thread.currentThread().getName());
//只有在main Thread中才能操作UI
Log.d(result,(String)msg.obj);
}
}
上述方法就實現了從子線程(worker線程)中向主線程(UI線程)發送消息,在主線程中處理消息。
主要步驟如下:
1. 准備Looper對象
2. 在 worker Thread生成Handler對象並實現`handleMessage()`方法;
3. 在MainThread當中通過Handler對象的`sendMessage(Message)`方法發送Message。
一般在子線程中的實現代碼如下:
new Thread(){
@Override
public void run() {
//准備Looper對象
Looper.prepare();
handler2 = new MyHandler();
//循環檢查消息隊列,然後調用handleMessage()方法處理,若沒有消息對象則該線程阻塞。
Looper.loop();
}
}.start();
這裡仍然使用了上面的MyHandler類。然後直接在主線程中調用handler2的sendMessage(Message)
方法就能向子線程中發送消息,並在子線程中處理消息了。代碼如下:
Message message = handler2.obtainMessage();
message.obj = 我是從main Thread向worker Thread 發送的消息;
handler2.sendMessage(message);
上述方法就實現了從主線程(UI線程)中向子線程(worker線程)發送消息,在主線程中處理消息。
也就是在哪裡創建Handler對象,就在哪裡處理該對象。
加速篇GRADLE的構建過程通常會比較漫長,一個中等項目,10M左右大小的app,一次完整構建大概在5分鐘左右,是不是很嚇人,當然,如果是在調試階段,采用Android
有時候,我們的微信會收到一些不認識的人發的廣告,甚至是一些微商的詐騙信息,特別一些微信群上,時不時就會遇到一些做垃圾廣告或者不法分子詐騙的,或者不小心就被加
最近做到一個項目,需要獲取手機號。項目中使用的手機卡為電信卡,那麼就以此為例吧。網上不符合需求的方法Google了一下,網上的做法如下://獲取手機號碼 Telephon
盡管Android向下兼容不好,但是一個程序還是可以在多個平台上跑的。向下兼容不好,接口改變,新的平台上不能用舊的API,舊的平台更不可能用新的API,不等於一個平台需要