在学习怎么使用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();
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);
//第一步: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);