多线程
为什么要用Handler
- Android 中的一些耗时操作需要在子线程中去完成,Android 又规定访问 UI 只能在主线程中进行,在子线程中访问 UI,程序就会抛出异常。系统提供 Handler 就是为了解决在子线程中无法访问 UI 的矛盾。
什么是Handler?
- 子线程通过Handler发送消息给Message,接下来Looper把取出的消息一个个发送给 主线程。
什么是Looper?
- 相当于一个不需要休息的工人,当Handler将消息发送到MessageQueue中时,它立马就会将发送到其中的信息取出来,一个个拿给主线程 。
什么是MessageQueue?
Handler怎么用?
- Handler的主要工作包含消息的发送与接收过程。消息的发送通过send方法来实现。当Handler发送了消息之后,MessageQueue里就插入了一条消息,然后MessageQueue就会返回这条消息给Looper,Looper接收到消息之后就开始处理了,最终消息由Looper交给Handler处理,这时Handler就进入了处理消息的阶段,最后经过一系列的判断之后,就会调用handleMessage()方法了。
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what==-1){
tvdown.setText("倒计时结束");
}else
tvdown.setText(msg.what+"");
}
};
new Thread(new Runnable() {
@Override
public void run() {
try {
while (cunt>0) {
Thread.sleep(1000);
cunt--;
handler.sendEmptyMessage(cunt);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
案例分析-倒计时Demo
public class downActivity extends AppCompatActivity implements View.OnClickListener{
TextView tvdown;
Button btdown;
EditText edtime;
int cunt=10;
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what==-1){
tvdown.setText("倒计时结束");
}else
tvdown.setText(msg.what+"");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_down);
tvdown=findViewById(R.id.tv_down);
btdown=findViewById(R.id.bt_downlad);
edtime=findViewById(R.id.et_time);
btdown.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.bt_downlad:
new Thread(new Runnable() {
@Override
public void run() {
try {
while (cunt>0) {
Thread.sleep(1000);
cunt--;
handler.sendEmptyMessage(cunt);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
break;
default:
break;
}
}
}