一、什么是Handler
1.定义:Handler是Android SDK中处理异步消息的核心类
Handler的作用是通过子线程通过与UI线程通信来更新UI界面
注意点:主线程不可做耗时工作 只有主线程可以更新UI
2.运行机制:
- 创建一个Handler对象,系统就把Handler对象、UI线程和UI线程的消息队列捆绑起来
- 在线程中处理完数据,可通过Handler对象将消息发出
- 消息将会按先后顺序添加到消息队列中
- UI线程中的Looper不断从消息队列中取出消息刷新UI
3.组成
Looper:可让线程不断的循环工作,将普通线程变成循环工作线程
MessageQueue:存放消息的地方
注意点:一个线程中只能有一个Looper和MessageQueue
二、什么是Message
1.Message对象:消息对象,子线程将需要传递的UI线程的消息放入Message对象中,Message对象可以通过Handler对象 的obtainMessage方法获得
2.属性:
- what:int类型的消息码,接受方用来识别是什么消息
- arg1,arg2:int类型,如果传递的消息仅仅是整形数字,可将字赋给arg1或arg2
- obj:Object类型:传递的消息是String或任意类型,可将数据赋给obj属性
- sendToTarget方法:将消息发送给指定的Handler对象
三、使用Handler的步骤
1.在UI线程中创建Handler 匿名内部类对象
2.在匿名内部类中重写handlerMessage方法
3.在UI线程中启动子线程
4.在线程中获得Message对象
5.将需要传递的数据赋值到Message对象中
6.通过Handler对象的sendMessage方法发送到消息队列
7.在handleMessage方法中接受消息
四、倒计时案件举例(附代码和效果图)
下面我为大家带来一道我对Handler类型题目的展示
1.首先新建一个新的CountTimeActivity和activity_count_time.xml布局文件
在activity_count_time.xml布局文件中定义出EditText,TextView和Button三个控件
<EditText
android:id="@+id/daojishi_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/daojishi_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="15dp"
android:textSize="20sp"
android:text="倒计时" />
<Button
android:id="@+id/daojishi_btn"
android:layout_width="90dp"
android:layout_height="50dp"
android:text="开始计时" />
在这里我用的是线性布局,排列方式为垂直
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.myapplication9.CountTimeActivity">
</LinearLayout>
2.下面就是在CountTimeActivity中来对控件进行定义,绑定ID。对Button进行设置监听。因为倒计时数字是越来越小,所以要在子线程里放一个for循环,同时在全局里定义一个Handler机制来作为主线程接受子线程发来的消息,对UI界面进行更新
public class CountTimeActivity extends AppCompatActivity {
private EditText daojishiET;
private TextView daojishiTV;
private Button daojishiBtn;
private int time;
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
daojishiTV.setText(msg.what+"");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_count_time);
bindID();
daojishiBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
time= Integer.parseInt(daojishiET.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.sendMessage(message);
handler.sendEmptyMessage(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}){}.start();
}
});
}
private void bindID() {
daojishiET=findViewById(R.id.daojishi_et);
daojishiTV=findViewById(R.id.daojishi_tv);
daojishiBtn=findViewById(R.id.daojishi_btn);
}
下面是几张成果效果图
上面就是我的分享,谢谢!