我通过以下方法取得远程服务器上一个xml文件。试验时,不用线程就无法访问网络。运行线程,取得xml文件的解析结果,放在parseResult中,parseResult是本页面的类成员变量。下方 if 语句在线程运行结束后,判断parseResult是否为空,不为空则取得其结果。运行时,下方判断语句中的parseResult为空,所以一直返回false。但跟踪执行时,线程中的parseResult是有结果的,不为空。
由于对线程不熟悉,不清楚如何在线程运行结束后,把所得到的parseResult,让后面的 if 语句使用。
请教大家,如何修改以下代码呢?
public boolean isUpdate()
{
int currentCode = getCode(mContext);
new Thread()
{
public void run()
{
try{
URL url = new URL("http://192.168.1.5/workers.xml");
HttpURLConnection urlConn =(HttpURLConnection)url.openConnection();
urlConn.setConnectTimeout(20* 1000);//设置连接超时
urlConn.setRequestMethod("GET");//以get方式发起请求
int state = urlConn.getResponseCode ();
System.out.println("state="+state);
if (urlConn.getResponseCode() != 200)
throw new RuntimeException("请求url失败");
InputStream is=urlConn.getInputStream();//得到网络返回的输入流
parseResult = readXML(is);//结果是一个list
urlConn.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}//run
}.start();//Thread
if (parseResult!=null)
{
float newCode=Float.valueOf(parseResult.get(0).getCode());
if (newCode > currentCode)
{
return true;
}
}
return false;
}
------解决方案--------------------
不是不用线程无法访问,而是UI线程延迟久了会ANR,程序无法运行。
你在自己的线程中执行,可以使用AsyncTask来进行网络操作的,或者说你的结果通过消息发出来。
你这样处理的话肯定是不行的。
关于多线程可以看看这篇文章:http://blog.csdn.net/isming/article/details/25924255
关于网络操作可以看看另一篇:
http://blog.csdn.net/isming/article/details/26399691
------解决方案--------------------
楼主对线程真是一无所知啊,当进行 parseResult 为空判断的时候,线程还没有取得结果哦,要等一会儿的。
线程放在页面上也是存在问题的,主要还是线程如何告知结果,楼主搜索下 handler 的用法吧