Android制作天气预报 —— 语录显示

语句显示功能与天气信息显示功能相似,在有网络的情况下调用接口并将获得的信息传递回指定区域显示。该功能位于初始界面,当界面切换或者点击相应图标都会使得语句发生变化。具体操作流程如图所示。

语录的显示和天气信息显示在同一个界面中,它的实现和获取天气信息以及城市信息相似,在MainActivity里定义变量和控件(图3-37)之后定义方法完成访问网络获取语句以及将语句传递给界面显示。

图 3- 37 定义变量和控件

(1)访问网络

首先实现负责访问网络获取语句的getDataFromServer()方法,如图3-37所示。

图 3- 38 getDataFromServer()

getDataFromServer()访问网址的方式与访问天气信息中的openConnection()访问网址方式(详情参照图3-2)原理相同,设计上的不同存在于以下两点:

1、存储访问信息的对象类型不同

openConnection()中使用String(result),getDataFromServer()中使用的是StringBuilder(stringBuilder)。虽然二者都是用来接收和处理字符串类型的数据,但是String拼接字符串时是先将每个字符串在内存中创建,然后再拼接字符串得到新字符串返回作为结果。而StringBuilder是一个动态对象,它所代表字符串是可变的,因此拼接字符串时直接在StringBuilder对象后加需要拼接的字符串即可,不需要将字符串另存一处先。所以StringBuilder相比于String更节省内存资源,拼接效率也会更高。使用StringBuilder对象拼接后返回的值也是StringBuilder类型,这时需要toString将其转化为String()。

2、访问结束后处理方式

访问天气信息中的openConnection()访问结束后返回结果便结束函数,而访问语录的getDataFromServer()得到访问结果并返回之后会用close()关闭输入流(inputStream)和字符流(bufferedReader)释放与其相关的系统资源,还会用disconnect()断开对网址的连接。为了确保close()和disconnect()能被调用,设计中采用的是try catch finally语句,无论try、catch语句中是否出现异常,finally中的语句都一定会执行。

(2)语句传到界面

语句信息的传递在初始化数据的函数initData()中出现,如图3-40所示,这里面采用了匿名内部类new Thread(new Runnable(){})方式,此时传给Thread构造函数的是一个实现Runnable的类的对象引用,在new Runnable(){public void run(){……}}中就包括定义这个类和实例化这个类的对象。类中采用键值对方式访问到的信息存到bundle中再封装进message发送给主线程。具体代码如图3-39所示。

图 3- 39 initData()

数据传递到主线程后,在主线程中回调handleMessage()来将获取数据传到界面。首先判断传来的信息码是否和预先设置的一样,相同说明获取到的数据是系统需要的,接下来从Message对象中接收数据存入data,将数据传到界面指定处。如图3-40所示。

图 3- 40 handleMessage()

若用户想更换显示的数据可点击右下角图标,系统对该图标设置了监听按键,点击图标则会调用初始化数据的initDate()函数对语句进行更换。

猜你喜欢

转载自blog.csdn.net/weixin_58963766/article/details/130567891