您的位置:首页 > 大数据 > 云计算

在VS.Net2010开发平台学习云计算开发

2010-11-22 17:29 204 查看
昨日看书,发现了一个不错的练习应用。
是一个天气预报的查询,我认为这个应用考察点还算比较全面。
打起精神,试着一做。昨日下午到刚才,基本上是做完了。
为了避免自己忘记写这个应用中的一些收获,遂姑且写入博客。
既然发表在了博客,就不免被各位达人或围观或小觑。
欢迎大家指点。

首先介绍一下这个应用,其实很简单:
首先从一个url获取描述天气信息的xml文件,之后解析,最后展示的UI。
该url为google提供:http://www.google.com/ig/api?hl=zh_cn&weather=需要查询的城市。

因为是自己的练习之作,所以根据自身情况加了一些东西。
有以下几点:
1,前台使用Spinner展示可供查询的城市列表。(未使用EditText)
2,Spinner所需数据(城市列表的字符串数组),由SharedPreferences读取。
3,用startActivityForResult,调用另一个Activity进行数据的初始化。这么做也许是没必要的,关键是为了再熟悉下Activity之间的数据传递。
4,查询天气时,没有进行Activity的跳转,而是使用了setContentView改换布局文件,用于显示查询结果。
6,展示信息的界面,用代码编写,未用xml布局文件。(也为练习用,熟悉多种方式)
5,xml解析,用DOM解析。

在做这个应用时遇到了以下几个问题,有必要记下来:
1,xml解析时,因为xml文件是以流的形式读取。而Google提供的这篇xml却没声明文件的编码类型。导致获取Document对象时,因为不能解析而出现异常。
我想到了这是由于流的编码问题造成的,于是想办法,希望给流设置一个编码集。
最后采用的是这个方法:
//以上略···
InputStream is = conn.getInputStream();

byte [] b = new byte [is.available()];
is.read(b);

String s = new String(b,Const.CHARSET);
return new ByteArrayInputStream(s.getBytes());

首先把读取到的流按需要的编码集构建成一个字符串,然后再根据这个编码后的字符串获取字节数组,构建一个字节数组输入流。
这个方法可能不好,但我只能想到这了。

2,书上说解析xml时,可以调用normalize方法,来去掉xml文件中因格式化而留下的空白文本节点。我试了下,不行,也不知道为什么。
最后还是用hasAttribute方法来判断的,剔除了那些空白。

3,关于用startActivityForResult,通过另一个Activity来初始化数据的问题。
数据初始化的代码,应该写在onActivityResult中,不可写在其他地方(比如onCreate方法内),否则会因为初始化数据还没返回,而导致初始化失败。
比如,我通过另一个Activity查询到了城市列表字符串数组,需要在onActivityResult中完成对Spinner的数据填充。(应用第一次启动时)

4,利用setContentView来改变布局的问题。简言之,利用这个方法,只会在界面上显示xml布局文件上有的内容。其余用代码编写的内容不会保留,比如对某个组件设置的事件监听。(貌似,监听也可以在xml布局文件绑定,我还没试过)。
所以在跳转时,一定要重新设置组件的监听等。

5,在另一个页面设置前一个页面中组件的监听时,也有一个问题。
虽然代码是用R.id.xxx来获取组件的,但是实际上前提是该xml布局文件已经被加载了。
否则该方法会返回null。
//必须先设置了布局,才能findViewById,否则因为没有对应的布局文件而找不到
context.setContentView(R.layout.main);
//利用setContentView切换页面,需要重新设置监听,代码是相同的
context.setOnclick(context);
context.setSpinner(context);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: