刚开始学习安卓,对照视频在Android Studio平台下练习项目,实现手机号码归属地查询。过程中遇到两个问题:
一:找不到资源文件
视频讲解是在eclipse平台,资源文件直接放到src根下面就可以。而我把资源文件soap12.xml放到java根路径下,以及放到当前包下,死活得不到文件,提示inStream为null。如下:
InputStream inStream = AddressService.class.getClassLoader().getResourceAsStream("soap12.xml"); //AddressService为自定义的业务类
不知道是不是类加载器的使用方式问题还是路径问题。
把soap12.xml文件放到res/raw下,换成以下方法来获取,结果成功:
InputStream inStream = context.getResources().openRawResource(R.raw.soap12);
需要说明的是,getResource()是Activity的函数,若自定义的类没有继承Activity的话就无法使用该API,故需要建一个构造器,然后把Activity传给该类。
二:请求网络数据不成功
原来的代码:
// HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();
// conn.setConnectTimeout(5000);
// conn.setRequestMethod("POST");
// conn.setDoOutput(true);
// conn.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
// conn.setRequestProperty("Content-Length", String.valueOf(entity.length));
// conn.getOutputStream().write(entity);
// if(conn.getResponseCode() == 200){
// return parseSOAP(conn.getInputStream());
// }
// return null;
修改后的代码:
new Thread(new Runnable(){ public void run() {
try{
HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
conn.setRequestProperty("Content-Length", String.valueOf(entity.length));
conn.getOutputStream().write(entity);
if(conn.getResponseCode() == 200){
final String str = parseSOAP(conn.getInputStream());
result = str;
}
}catch(Exception e){
e.printStackTrace();
}
}}).start();
return result;
//以上代码放到线程里面就可以了!
视频讲解同样请求非本机上的网络数据,没有放到线程里面就成功了。不知道为什么,以后请求网路资源就重开一个线程好了!