Android - 利用超时方法,解决 read堵塞问题

超时方法

	//超时
	Timer timer;
    class MyTimerTask extends TimerTask{
        @Override
        public void run() {
            handler.sendEmptyMessage(0);
        }
    }
    
    private static void checkTimeOut(){
        try{
            timer = new Timer();
            MyTimerTask task = new MyTimerTask();
            timer.schedule(task, 800); //如等待800ms,无停止时间操作则记为超时
        }catch(Exception e){
            Log.e("--------", e.getMessage());
        }
    }
    Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            switch(msg.what){
                case 0:
                    //关闭计时
                    timer.cancel();
                    //执行操作
                    	... ...
                    break;
            }
        };
    };

在这里插入图片描述

使用场景

此方法为会阻塞,size = mInputStream.read(buffer);

  1. 当有数据读到时,则 size > 0
  2. 读取失败时或读取完毕,则 size < 0
  3. 还有一种情况是,啥也读取不到时,会一直堵塞不执行也不退出,这时就需要设置超时时,执行退出

使用时,checkTimeOut()放在read()前

	//设置超时
    checkTimeOut();
    
    size = mInputStream.read(buffer);
    Log.d("---------", "size-----" +size);
    byte []receviceData = new byte[size];
    System.arraycopy(buffer,0,receviceData,0,size);
    if (size > 0) {
          Log.d("---------", "recevice message,length = " + size);
          Message message = new Message();
          message.what = 0;
          message.obj = receviceData;
          mHandler.sendMessage(message)                   
          handler.sendEmptyMessage(1);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值