在学习怎么使用Handler机制来达到这些效果之前,最好还是对Handler机制、异步通信、同步通信有一个了解,前面发表过一篇博客是关于Handler机制讲解的:http://blog.csdn.net/u013035016/article/details/51181286
在开发中,我们经常会碰到这类问题:
1、网络访问,面对请求反馈处理数据和UI
2、我们开启了一个Adapder类,但是在item里的操作需要刷新界面,这个时候我们通常是在Adapter执行监听操作,在主界面的UI类里刷新界面,怎样传递这个信息?
3、我们经常会开启一个类似dialog, PopupWindow等控件之后,里面的操作需要我们刷新主界面
4、开启倒计时
面对这些情况,我们都可以用Handler机制来异步处理
1、网络访问
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main_activity);
}
private void TestMethod(){
//TODO 一般在这里开启一个进度条
new Thread() {
public void run() {
try {
//TODO 这里添加一个网络访问操作
Message msg = new Message();
msg.obj = result;
msg.what = 3;
handler.sendMessage(msg);
} catch (IOException e) {
//TODO 这里需要关闭一下进度条
e.printStackTrace();
}
};
}.start();
}
//new一个处理会掉信息的Handler
Handler handler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
//TODO Something
break;
}
}
};
}
2、Adapter,dialog,PopuWindow等回调数据
从主类中new一个Handler的回调处理,并传入Handler
Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 0: // 返回编辑
//TODO 在这里执行返回后需要的操作
}
}
};
ReEditDialog dialog = new ReEditDialog(this,handler);//传入handler
dialog.show();
在Adapter,dialog,PopuWindow等中发送消息
Message msg = new Message();
msg.what = 0;
handler.sendMessage(msg);
3、开启倒计时
Handler verifyTimeOutHandler = new Handler();
private int verifyMobileTimeOut=30;
private int timeOutIndex=verifyMobileTimeOut;
private Runnable verifyTimeOutThread = new Runnable() {
public void run() {
if(timeOutIndex>0){
bt_get_verrifycode.setText(timeOutIndex+"秒后重试");
bt_get_verrifycode.setTextColor(Color.WHITE);
timeOutIndex--;
verifyTimeOutHandler.postDelayed(this,1000);//参数是Runnable和延迟时间
}else{
timeOutIndex=verifyMobileTimeOut;
verifyEnable();
}
}
};
//某个方法里面开启发送
verifyTimeOutHandler.post(verifyTimeOutThread);
总结:一般使用Handler主要就是注意两个地方:一是new一个handler处理接收的回调数据,二是用handler发送消息
//第一步:new一个handler处理接收的回调数据
Handler handler = new Handler() {
public void handleMessage(Message msg) {
<span style="white-space:pre"> </span>switch (msg.what) {
case 0: // 返回编辑
//TODO 在这里执行返回后需要的操作
}
}
};
//第二步:<span style="white-space:pre">用handler发送消息
Message msg = new Message();
msg.what = 0;
handler.sendMessage(msg);