一、Handler的定義和作用
Handler是Android系統里非常重要的一個類,它主要用於線程間的通信和消息處理。它允許您發送和處理與應用程序相關的消息和Runnable對象,這些對象可以在不同的線程中進行處理。
當我們需要執行一些耗時的操作時,如果直接在UI線程中進行,會導致UI界面卡頓,用戶體驗非常不好。這時,我們可以新建一個子線程來進行耗時操作,但是子線程不能直接更新UI,需要通過Handler來實現線程間的通信。另外,在需要進行一些延時任務或周期性任務時,也可以使用Handler來實現。
二、Handler的使用方法
Handler的使用方法包括以下步驟:
1. 創建Handler
/**
* 自定義Handler,用於接收消息並處理
*/
private Handler mHandler = new Handler() {
// 子類必須重寫此方法,接收數據
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// TODO 處理接收消息的邏輯
}
};
2. 創建子線程
/**
* 創建子線程
*/
private class MyThread extends Thread {
@Override
public void run() {
super.run();
// TODO 執行耗時的操作
mHandler.sendEmptyMessage(MSG_FINISH);
}
}
3. 發送消息
/**
* 發送消息
*/
private void sendMessage() {
new MyThread().start();
}
4. 處理消息
/**
* 處理消息
*/
private static final int MSG_FINISH = 1; // 定義消息ID
private void doHandleMessage(Message msg) {
switch (msg.what) {
case MSG_FINISH:
// TODO 更新UI或其他操作
break;
default:
break;
}
}
三、Handler的常用方法介紹
1. sendMessage()
sendMessage()方法用於向Handler發送消息,包括Message對象和Runnable對象。
/** * 發送空消息 */ public static final int MSG_EMPTY = 1; mHandler.sendEmptyMessage(MSG_EMPTY); /** * 發送普通消息 */ Message msg = Message.obtain(); msg.what = MSG_FINISH; msg.obj = data; // 可以在Message中攜帶數據 mHandler.sendMessage(msg); /** * 發送延時消息 */ mHandler.sendEmptyMessageDelayed(MSG_EMPTY, 3000); // 延時3秒
2. removeMessages()
removeMessages()方法用於移除指定類型的消息。
mHandler.removeMessages(MSG_EMPTY); mHandler.removeCallbacks(runnable); // 移除Runnable對象
3. post()
post()方法用於將Runnable對象添加到消息隊列中執行。
mHandler.post(runnable); // 將一個Runnable對象添加到消息隊列中
4. postDelayed()
postDelayed()方法用於將Runnable對象延時添加到消息隊列中執行。
mHandler.postDelayed(runnable, 3000); // 延時3秒執行Runnable對象
四、實例代碼
下面是一個完整的示例代碼:創建一個子線程進行耗時操作,處理完畢後通過Handler通知UI線程進行更新。
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MSG_FINISH:
mTextView.setText("耗時操作完成!");
break;
default:
break;
}
}
};
private static final int MSG_FINISH = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = findViewById(R.id.text_view);
sendMessage();
}
/**
* 發送消息
*/
private void sendMessage() {
new MyThread().start();
}
/**
* 創建子線程
*/
private class MyThread extends Thread {
@Override
public void run() {
super.run();
// 模擬耗時操作
SystemClock.sleep(3000);
mHandler.sendEmptyMessage(MSG_FINISH);
}
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/190400.html
微信掃一掃
支付寶掃一掃