我们假设在一个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请求