一、什么是Handler?
Handler是Android SDK处理异步消息的核心类。
Handler的作用是让子线程通过UI线程通信来更新UI界面。
图片来自网络
二、什么是Looper和MessageQueue?
Looper就是可以将普通线程转为循环工作的线程的方法。
当创建Looper时,将会自动创建出MessageQuene方法,
一个线程只会存在一个Looper和MessageQuene。这样,
可以让消息更加高效的传输。
三、什么是Message?
Message对象,子线程将需要传递到UI线程的信息
放入Message对象中。Message对象可以通过Handler对象
的obtainMessage方法获得
1. arg1:存放一个int类型的数据
2. arg2:存放一个int类型的数据
3. what:存放一个int类型的数据,该数据表示信息的类型,用来区别其他消息
4.Object obj:存放任意类型的对象
四、如何使用Handler?
在UI线程中创建Handler匿名内部类对象
在匿名内部类中重写HandlerMessage方法
在UI线程中启动子线程
在线程中获得Message对象
将需要传递的数据赋值到Message对象中
通过Handler对象SendMessage方法发送消息到消息列队
在handleMessage方法中接收
五、倒计时案例举例
用一个倒计时案例举例:
首先进行XML文件布局:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:orientation="horizontal">
<TextView
android:layout_width="100dp"
android:layout_height="50dp"
android:textSize="25sp"
android:text="设置时间"
/>
<EditText
android:id="@+id/sx_textview"
android:layout_width="50dp"
android:layout_height="40dp"
/>
<TextView
android:id="@+id/show_tv"
android:layout_width="100dp"
android:layout_height="50dp"
android:textSize="25sp"
android:text="秒"
/>
</LinearLayout>
<TextView
android:id="@+id/js_textview"
android:layout_width="match_parent"
android:layout_height="50dp"
android:textSize="30sp"
/>
<Button
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="开始计时"
android:textSize="25sp"
android:id="@+id/start_btn"
/>
在java文件中用Handler、Message、for循环方法实现倒计时:
//Handler方法中使用Message接受子线程发来的消息
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
showText.setText(msg.what + "");
}
};
startbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
time = Integer.parseInt(editText.getText().toString());
new Thread(new Runnable() {
@Override
public void run() {
for (int i=time; i>=0;i--){
Message message=handler.obtainMessage();
message.what=time;
handler.sendEmptyMessage(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();