1、handler是什么
- handler是Android给我们用来更新Ui的一套机制,是一套消息处理的机制。用于线程之间的通信,可以通过它来处理消息,。
2、为什么使用handler,不使用handler可以更新UI吗?
是不行的,Android在设计的时候,封装了一套消息创建、传递、处理机制。如果不遵循这样的机制是没有办法更新Ui的,会抛出异常信息。
举个例子:
在主线程中去更新uI
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread() {
@Override
public void run() {
super.run();
try {
//模拟耗时操作
sleep(1000);
bt1.setText("在子线程更新了Ui!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
});
运行后抛出了异常:不能在工作线程中更新UI
android.view.ViewRootImpl$CalledFromWrongThreadException:
Only the original thread that created a view hierarchy can touch its views.
所以Android只能在主(UI)线程中更新UI
3、handler使用介绍(一)
在Android中我们应该怎么去更新Ui呢?
用handler去更新UI
handler.post();使用
//创建handler对象
Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread() {
@Override
public void run() {
super.run();
try {
//模拟耗时操作
sleep(1000);
//post更新UI
handler.post(new Runnable() {
@Override
public void run() {
//ru方法是在主线程中的
bt1.setText("在子线程更新了Ui!");
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
});
handler.postDelayed();发送延时消息
先看效果
每秒加1
代码
//创建handler对象
Handler handler = new Handler();
private int index;
private Myrunnable myrunnable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
myrunnable = new Myrunnable();
index = 0;
new Thread(){
@Override
public void run() {
super.run();
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//一秒发送一次
handler.postDelayed(myrunnable, 1000);
}
});
}
}.start();
bt2.setText("stop");
bt2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//关闭此定时器
handler.removeCallbacks(myrunnable);
}
});
}
class Myrunnable implements Runnable {
@Override
public void run() {
//更新Ui操作
index++;
//间隔1秒+1
bt1.setText("index" + index);
//一秒发送一次
handler.postDelayed(myrunnable, 1000);
}
}
4、handler使用介绍(二)
handler.sendMessage(message);
效果:通过sendmessage发送给主线程消息
GIF.gif
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
new Thread() {
@Override
public void run() {
super.run();
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
//耗时操作
sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//发送给主线程去更新信息
Message message = new Message();
//发送的标识,接受的时候判断水去接受
message.what = 0;
//传递单个int类型的值
message.arg1 = 100;
//发送任意类型的,可以是服务器传回来的jsoN,s实体类
message.obj = "我是任意类型的数据{Joson,[数组],集合}";
handler.sendMessage(message);
}
});
}
}.start();
}
//接受发送回来的消息
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
bt1.setText("我被改变了这是message0的 " + msg.arg1 + msg.obj);
break;
}
}
};
网友评论