一、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); } } }