Android 为什么要有handler机制

     我们假设在一个UI界面上面,有一个按钮,当点击这个按钮的时候,会进行网络连接,并把网络上的一个字符串拿下来显示到界面上的一个 TextView上面,这时就出现了一个问题,如果这个网络连接的延迟过大,可能是10秒钟甚至更长,那我们的界面将处于一直假死状态,而如果这段时间超 过5秒钟或者更长的话,程序会出现异常。

      这时我们会想到使用线程来完成以上工作,即当按钮被按下的时候新开启一个线程来完成网络连接工作,并把得到的结果更新到UI上面。但是,这时候又会 出现另一个问题,在Android中,主线程是非线程安全的,也就是说UI的更新只能在本线程中完成,其他线程无法直接对主线程进行操作。

      但是,完全依赖handler也会有一些问题,比如传递一个比较长的字符串之前还调用了Toast,由于hander的异步实现机制,会有系统产生“系统内部的延迟”,从而实现不了下方队json的解析,因为json还没有准备好(除非你有一个更新呢的按钮)。但是群哥采用了一个比较猥琐的用法,在json解析之前就是强制延迟一下。等待hander对json的更新,这样就解决了,猥琐的代码如下:

 textArea=get(UserData.phoneStr);
        try{
            //很无奈的强制延迟3秒  等待 handler异步回掉  传递android.os.Message msg实例化textAtra字符串
            Thread.sleep(3000);
            JSONObject root=new JSONObject(textArea);
            JSONArray array=root.getJSONArray("question");
            for (int i = 0; i < array.length(); i++) {
                JSONObject subroot=array.getJSONObject(i);
                Question question=new Question();
                question.title=subroot.getString("title");
                question.context=subroot.getString("context");
                question.response=subroot.getString("response");
                questions.add(question);
                System.out.println(questions.size());
            }
        }catch (Exception e){
            e.printStackTrace();
        }
get为http发送get请求

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值