一、小標題1:Handler背景
Handler最初出現在Android系統的消息機制中,它有點像是線程的便攜式形式,負責在不同的線程之間傳遞消息以及執行相關的代碼。相比於其他線程間的通信方式(如BroadcastReceiver、Intent等),Handler具備高度可定製性、高效性以及靈活性。由於其在Android的應用開發中應用非常廣泛,所以構建一個良好的Handler機制非常重要。
Handler機制基本的工作原理是,一個Handler對象與一個線程相關聯,接收其線程的MessageQueue的消息,然後在該線程上進行處理。一個Thread對象可以對應多個Handler對象,但一個Handler對象只能與一個特定的線程綁定。當Handler對象收到一條消息時,它會先將消息封裝為一個Message對象,然後將該對象放到目標線程的MessageQueue隊列中,由目標線程依次去處理其中的每個消息。
public class Looper {
static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<>();
final MessageQueue mQueue;
private Looper() {
mQueue = new MessageQueue();
}
public static void prepare() {
if (sThreadLocal.get() != null) {
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper());
}
public static Looper myLooper() {
return sThreadLocal.get();
}
public static void loop() {
final Looper me = myLooper();
final MessageQueue queue = me.mQueue;
for (;;) {
Message msg = queue.next(); // 阻塞在這等待下一個消息
msg.target.dispatchMessage(msg);// 將消息分發給目標handler處理
}
}
}
二、小標題2:Handler的用處
1、線程間通信。如在子線程中更新UI,可以通過Handler機制將子線程中的代碼post到UI線程執行,避免了UI更新時的問題。
2、定時器。通過Handler機制,可以實現定時器的功能,如在指定時間後執行特定任務,並實現定時重複執行的功能。
3、優化性能。Android中涉及到與用戶交互的事件,如觸摸屏事件或按鍵事件,通常是在單獨的線程中執行的,這些線程通過Handler機制通知UI線程執行相關的操作,從而提高了應用的性能。
public class ExampleActivity extends Activity {
private TextView textView;
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
new Thread(new Runnable() {
@Override
public void run() {
// 處理相關任務
// 下面通過Handler機制將任務post到UI線程中更新UI
handler.post(new Runnable() {
@Override
public void run() {
textView.setText("任務處理完畢,數據已更新!");
}
});
}
}).start();
}
}
三、小標題3:Handler的基本使用
1、在子線程中使用Handler
在子線程中使用Handler進行UI操作,需要先在UI線程中創建Handler並傳遞到子線程中,然後在子線程中使用Handler.post()方法將任務post到UI線程中。
public class ExampleActivity extends Activity {
private TextView textView;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
handler = new Handler(); // 在UI線程中創建Handler
new Thread(new Runnable() {
@Override
public void run() {
// 處理相關任務
// 下面通過Handler機制將任務post到UI線程中更新UI
handler.post(new Runnable() {
@Override
public void run() {
textView.setText("任務處理完畢,數據已更新!");
}
});
}
}).start();
}
}
2、在UI線程中使用Handler
在UI線程中使用Handler可以直接創建Handler對象,然後直接使用Handler.post()方法進行操作。
public class ExampleActivity extends Activity {
private TextView textView;
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
handler.post(new Runnable() {
@Override
public void run() {
textView.setText("數據已更新!");
}
});
}
}
四、小標題4:Handler的特性
1、UI線程的唯一性,即UI線程在主線程中被調用。
2、線程之間的通信,即不同的線程之間可以使用Handler發送和接收消息。
3、定時執行任務,在Handler中可以使用postDelayed()方法設置定時任務的執行時間。
4、線程安全,即在多線程環境下,Handler的執行是線程安全的。
五、小標題5:Handler的注意事項
1、Handler需要按照Android開發規範進行使用,否則會出現很多問題。
2、在使用Handler的過程中要避免內存泄漏問題,即在Activity的onDestroy()方法中將Handler對象置空。
3、Handler的執行是異步的,需要注意數據同步的問題。
4、避免在主線程中執行耗時操作。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/311314.html
微信掃一掃
支付寶掃一掃