Android用Handler+Timer 异步加载

41 篇文章 0 订阅

Android用Handler+Timer 异步加载  

2013-05-13 23:04:47|  分类: Android |  标签:android  handler  timer  异步加载   |字号 订阅

在Android中,Handler负责发送和处理消息。它的主要用途有:
  1)按计划发送消息或执行某个Runnanble(使用POST方法);
  2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程)
   默认情况下,Handler接受的是当前线程下的消息循环实例(使用Handler(Looper looper)、Handler(Looper looper, Handler.Callback callback)可以指定线程),同时一个消息队列可以被当前线程中的多个对象进行分发、处理(在UI线程中,系统已经有一个Activity来处理了,你可以再起若干个Handler来处理)。在实例化Handler的时候,Looper可以是任意线程的,只要有Handler的指针,任何线程也都可以sendMessage。Handler对于Message的处理不是并发的。一个Looper 只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的(handleMessage()方法里不应该有耗时操作,可以将耗时操作放在其他线程执行,操作完后发送Message(通过sendMessges方法),然后由handleMessage()更新UI)。

由于项目中采用的是Socket通讯方式,且由于需要时时保持通讯状态,因此把Socket连接放到Service里,运行在后台。进行数据交互时,只需要调用Service中对应的方法,即可把相应格式的数据传递给服务器。至于Service中做法,暂时不提。
由于向服务器端发送请求后,如果服务器长时间没有反馈数据,且Socket连接没有出现问题的话,则客户端会一直“等待”下去,这样会影响客户的体验效果,因此需要使用Timer来实现定时效果。

在使用Handler+Timer前,需要定义好:

        private Timer timer;           //定时器
private final int SUCCESS=0;   //成功
private final int FAILURE=1;   //失败
private final int OUTTIME=2;   //超时
private int num=60*1000/10;    //循环次数
private int intervals=10;      //时间间隔
private Handler handler=new Handler()
{
@Override
public void handleMessage(Message msg)
{
super.handleMessage(msg);
switch(msg.what)
{
case SUCCESS:
//此处添加获取数据成功操作,比如更新UI界面等
break;
case FAILURE:
//此处添加获取数据失败操作
break;
case OUTTIME:
//此处添加连接超时操作
break;
}
}
};
使用的时候,需要在一个方法体内添加如下代码:
timer=new Timer();
                   /**
                     *  其中,service是一个定义好的Service服务,且用Socket连接好服务器,
                     *              sendMessage ()则是service中一个方法,把传入的值,用Socket通讯方式发送到服务器端
                     **/
                service.sendMessage("msg");

timer.schedule(new TimerTask(){
int count=0; //记录下循环次数
@Override
public void run() {
// TODO Auto-generated method stub
                                /**
                                 *  其中,service是一个定义好的Service服务,且用Socket连接好服务器,
                                 *             getWorkStatus()则是service中一个方法,返回一个代表是是否接收到服务器端返回信息
                                 *             的String字符串。如果客户端发送的请求没错误,值为success,,否则为failure
                                 **/
String str=service.getWorkStatus();
                               if ( null ! = str )
                                 {
if(str.equals("success"))
{
this.cancel();
handler.sendEmptyMessage(SUCCESS);
}
else if(str.equals("failure"))
{
this.cancel();
handler.sendEmptyMessage(FAILURE);
}
 
                                  }
count++;
if(count>num)
                                 //如果循环次数超过预定最大循环次数,则提示超时
{
this.cancel();
handler.sendEmptyMessage(OUTTIME);
}
}
}, 10, intervals);
}

当然,也可以用其他方法实现,但原理和上面的例子差不多而已。这段代码只供参考,并不提供源码。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值