****Android高级应用开发第三章---Handler****
一.什么是Handler?
Handler是Android SDK 中处理异步消息的核心类。
Handler的作用是让子线程通过和UI线程通信来更新UI界面。
二.什么是Looper和MessageQueue?
1.MessageQueue:(存放消息的盒子)
当创建Looper时,将会自动创建出MessageQueue。
一个线程中只会存在一个Looper和一个MessageQueue。
当MessageQueue中有消息时,Looper将从MessageQueue中取出消息。
2.Looper:(从盒子里不断取出消息的机器人)
在Android中创建出的普通线程默认是没有消息循环的,run方法执行完毕,线程也就结束了。如果让线程不停的循环工作时,可以使用Looper,将普通线程变成循环工作线程。
三.什么是Message?*(需要传递的消息)*
Message就是消息对象,子线程将需要传递到UI线程的信息放入Message对象中,Message对象可以通过Handler对象的obtainMessage方法获得。
四.如何使用Handler?(附代码和效果图)
1.在布局文件中这样写:
<TextView
android:id="@+id/download_tips"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="准备下载"
android:textSize="30sp"/>
<Button
android:id="@+id/download_btn"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="开始下载"/>
2.子线程代码:
//启动子线程,模拟5秒钟的下载过程
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);//停顿5秒
} catch (InterruptedException e) {
e.printStackTrace();
}
Message message=handler.obtainMessage();
message.what=1;
message.arg1=2;
message.obj="hello";
handler.sendMessage(message);
}
}).start();
}
});
3.UI线程代码:
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int arg1=msg.arg1;
String info=(String) msg.obj;
if (msg.what==1){
downloadtips.setText("下载完成");
}
}
};
五.倒计时案例举例(附代码和效果图)
1.布局文件这样写:
<EditText
android:id="@+id/zbtv"
android:textSize="20sp"
android:layout_width="match_parent"
android:layout_height="50dp" />
<TextView
android:id="@+id/zztv"
android:gravity="center"
android:textSize="40sp"
android:text="到计时"
android:layout_width="match_parent"
android:layout_height="200dp" />
<Button
android:id="@+id/ksbtn"
android:text="开始计时"
android:layout_width="match_parent"
android:layout_height="50dp" />
2.java代码
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
zztv1.setText(msg.what + "");
}
};@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler);
BindId();
ksbtn1.setOnClickListener(new View.OnClickListener()//设置监听 {
@Override
public void onClick(View view) {
time = Integer.parseInt(zbtv1.getText().toString());//将字符串转换成整形
new Thread(new Runnable() {
@Override
public void run() {
for (int i = time; i > 0; i--)//时间倒计时
{
//更新UI
Message message=handler.obtainMessage();
message.what=i;
handler.sendMessage(message);
//handler.sendEmptyMessage(i);
try {
Thread.sleep(1000);//停顿1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
});
}
private void BindId()//绑定ID {
zbtv1 = findViewById(R.id.zbtv);
zztv1 = findViewById(R.id.zztv);
ksbtn1 = findViewById(R.id.ksbtn);
}
}
“`