基于安卓系统天气预报应用程序开发本科毕业论文_第1页
基于安卓系统天气预报应用程序开发本科毕业论文_第2页
基于安卓系统天气预报应用程序开发本科毕业论文_第3页
基于安卓系统天气预报应用程序开发本科毕业论文_第4页
基于安卓系统天气预报应用程序开发本科毕业论文_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于安卓操作系统的天气预报应用程序开发摘要

安卓操作系统的出现,使得在智能时代中,其成为了最受欢送的应用平台之一。每天几十万部安卓的激活量等迹象说明,安卓的未来的开展方向和产业结构必定成为一些相关的公司战略开展的焦点。作为在安卓上运行的应用程序,也是在不断的快速开展,到达了日新月异的辉煌局面。为了来不断的扩充的功能,使用者可以通过自主选择安装各种所需要的应用软件,再连接网络,这样就可以扩充功能。通过充分的利用本身的软硬件资源,当用户连接网络时,就可以轻松地访问到网络上的各种资源,获取各种有用的信息。关键字:智能,安卓,操作系统,应用程序THEDEVELOPMENTOFWEATHERFORECASTAPPLICATIONBASEDONTHEANDROIDOPERATINGSYSTEMABSTRACTWhenandroidoperatingsystemhasbecometrue,Androidisbecomingoneofmostpopularapplicationplatforminallovertheworld.Everydayhundredsofthousandsofandroidareactivatedwhatindicatesthatthefuturedevelopmentpatternwillundoubtedlybecomethefocusoftheobjectandoftherelatedindustriesarefollowing.Applications,whichisrunontheandroidOSaredevelopingrapidlyandhasreachedthechangingsituation.UserscaninstallallkindsofapplicationsoftwarewhichareneededandconnecttheInternet,inordertocontinuouslyexpandthefunctionofmobilephone.Byusingthephoneitselfandnetworkhardwareandsoftwareresourcesasmuchaspossible,andconnecttotheInternet,userscanaccesstoallkindsofresourcesonthenetworkeasilyandgetallsortsofusefulinformation.KEYWORDS:Android,operatingsystem,smartphone,application目录TOC\o"1-6"\h\u12470摘要 I493ABSTRACT II173481前言 1279621.1安卓操作系统简介以及开展 1137251.2应用程序介绍和开展 264171.3应用程序开发现状 3225411.4工程开发意义 4167752工程需求分析 4108772.1功能分析 4300452.2性能分析 5250002.3平安分析 5234132.4研究内容和开发环境需求 64303工程设计分析 694943.1程序功能模块图 669283.2显示信息设计 7111673.3解析数据 7259193.4界面设计 7252543.4.1程序启动界面 8263773.4.2信息界面之主界面〔MainPage〕 8127463.4.3信息界面之二〔NextPage〕 983793.4.4信息界面之三〔PreviousPage〕 985693.4.5查询界面 9176613.5算法流程图 10322314工程实现 13273154.1启动画面 1361184.2信息界面显示实现 15181704.2.1Weather 1585444.2.2NextPage 18307754.2.3PreviousPage 19109534.3天气查询 19292484.4GetWeatherService 20125504.5下拉刷新 21238485工程调试和效果分析 23265175.1工程调试分析 238365.2效果图 262306总结 334181参考文献 342024谢辞 35 1前言1.1安卓操作系统简介以及开展一个基于Linux内核的,现在流行的主流的系统之一——安卓操作系统。Google公司早在2007年11月5日就公布的这款操作系统,安卓系统是一款系统。目前有很多的采用这款安卓系统。除此之外,系统还有,苹果的IOS系统、微软的wm系统、诺基亚的塞班系统、HTC的黑莓系统等。类似于电脑的window7和window8系统等,这款系统常用在除了苹果外的绝大数智能上,属于智能操作系统。安卓最新版本为Android4.4.2KitKat。它是第一个为移动终端设计的开放的系统程序。从android的意思为机器人就可看出,其有一定的智能化。安卓是以Java语言为根本的编程语言,从操作系统,到用户界面和应用软件,从接口到功能,都有着和大的变化。Android主要有四大组件,包括Activity,Service,Broadcast和ContentProvider。其中Activity,个人认为是一个容器,里面存放了要在界面上显示的各个控件,当然还有包括实现这些控件的代码。我们可以通过Activity类负责创立用于人机交互的视图,安卓中分为两种模式,一种是前景模式,另一种是背景模式分别对应的是Activity和Service。它们如果是属于一个进程内的,那么将会通过binder来进行通信,如果是属于两进程内的,那么将会通过AIDL来进行远程通信。当然在这里就会牵涉到界面设计,安卓开发程序员可以通过XML文件来配置,也通过直接在这个文件中设置数据,将结果显示给用户。安卓现在有很大的开展优势,同样是的只能操作系统,安卓比奄奄一息的塞班更为华美,相比拟wm和黑莓操作系统,安卓在第三方软件方面更加丰富。随着时间的推移和科技的进步,全球范围内唯一能和苹果IOS分庭抗礼的操作系统也只有安卓操作系统了。由于安卓是采用Java语言来开发的,这又给了大量Java程序员提供了便利,这也给安卓开发了带了很大的生机。谷歌公司从2021年开始发布了很多个版本,根本上都是以糖果命名的,从Android1.6Donut版本,直到现在的Android4.4Katit。主要的参数有:CPU和电脑一样,主要负责处理数据,现在安卓的根本上都上了四核,但是并不意味着核心数越大越好,CPU的架构和主频对性能影响也很大。GPU就是相当于电脑的显卡,当用户玩游戏时,或者要求的界面很华美时,就要处理繁重的图形数据,这样,就可以得到一个判断GPU性能的依据是多边形生成能力和像素渲染能力。RAM相当于电脑的内存,是系统和应用程序的运行内存,其值越大的处理能力表现的就会越强。充足的RAM空间,可以确保同时翻开多个应用软件也能表现出很流畅,根本上不会出现卡机现象。ROM相当于电脑的硬盘,是用来存储的数据的,毫无疑问,ROM越大越好,你能存放的数据就越多。除此之外,还有一些重要的参数指标如,屏幕、电池容量、SIM卡、摄像头、像素、以及USB接口。1.2应用程序介绍和开展安卓操作系统的出现,使得在智能时代中,其成为了最受欢送的应用平台之一。每天几十万部安卓的激活量等迹象说明,安卓的未来的开展方向和产业结构必定成为一些相关的公司战略开展的焦点。作为在安卓上运行的应用程序,也是在不断的快速开展,到达了日新月异的辉煌局面。Android应用程序当中有很多组件,遵守着应用程序清单AndroidManifest,在此配置文件中,还需要来描述每个组件之间如何进行交互。还包括要求应用程序元数据的硬件平台。安卓有四个主要组件,分别是Activity,是应用程序中的表示层。应用程序的每个界面都是Activity类的子类,Activity用视图〔View〕构成显示信息,响应操作。第二个是Services,这个组件在后台运行,更新用户需要的可见的数据和显示的Activity,是个默默无闻的“幕后工作者〞。除此之外还可以触发通知。在应用程序的Activity不激活或者不可见的时候,可以进行一些用于执行需要长期处理的事情,比方下载等。第三个是ContentPrivider,可以提供数据的共享。这个组件用于管理和共享应用程序数据库。是跨应用程序界限共享数据的优先方式,个人理解是可以进行进程间的数据共享访问。当想把自己程序的数据和别的程序进行互相通信,就可以通过配置自己的消息提供者,这样就可以以允许其他程序来访问它的数据。第四个组件是Broadcaset〔播送接收者〕,个人理解是Intent的消费者,如果在应用程序中创立并注册一个BroadcasetReceiver,此时应用程序就可以监听匹配了特定标准的播送Intent。播送接收者会启动一个事件来响应这个收到的Intent。图1显示的是安卓系统框架。图1-1安卓系统框架除了这四大组件之外,Intent功能挺强大的,用途也很广泛。一个应用程序间的消息传递的传送者。利用Intents,能够在系统范围内播送消息,也可以对一个Activity或Serivce发送消息,可以运行一个乃至多个Activity或者Service。系统将会自动区分出相应的活动目标。安卓应用采用的是java语言,具有丰富的类库,而且逻辑代码与界面设计别离,这也给开发人员带来了强大的便利性,还有最主要的一点是权限控制开放。也可以提供了很多学习的时机。有的安卓应用软件的开发技术不是孤立的,不是只是会java语言就可以的,它需要在掌握Android三层框架同时,也必须融合Java层框架内的通信机制、通过JNI层来将Java和C/C++联合起来、HAL驱动框架及其API、有的甚至是牵涉到了Linux内核局部。1.3应用程序开发现状具有独立操作系统〔android和ios等〕的,为了来不断的扩充的功能,使用者可以通过自主选择安装各种所需要的应用软件,再连接网络,这样就可以扩充功能。通过充分的利用本身的软硬件资源,当用户连接网络时,就可以轻松地访问到网络上的各种资源,获取各种有用的信息,以此来提高的智能化。而这自然的也就极大的方便了用户,应用程序可以给用户带来很多的娱乐时光。用户可以通过只能来获取很多有趣、实用的信息,体验智能化带来的有滋有味生活。早在2021年的第三季度,用户通过配置有安卓操作系统的智能或者平板电脑下载的应用程序的价值就到达了300多亿美元。无论人们想下载什么程序,这些应用程都已经完成了。由于安卓应用程序属于一个较新兴的技术和开展快速的模式,开发安卓应用程序在整个市场经济产业中,仍是一个缺口比拟大的一个方面。这就是为安卓应用程序的开展带来了一个蓬勃开展的时机。1.4工程开发意义在我们这个时代中,已经步入了一个网络化,信息化程度相当高的时代,科学技术一日千里,飞速兴旺。随之而来的是社会竞争越来越剧烈,如何在这个繁华而又复杂的社会里能永葆生机,提升自己的竞争力,让自己立于不败之地呢。其中一个必要条件是能够及时的获取信息,正确的分析和处理信息,对社会的最新动态有一个适当的掌握和运用,然后才能有确切的目的和目标来获取自己想要的信息和成果。从目前的各种消息渠道来看,最快捷的方式莫过于智能,没有电脑那么笨重,但是却能极大程度的到达电脑给我们的使用效果。凭借着其携带方便,有强大的功能等,给我们的生活娱乐和工作带来了很多便利。选择开发一个基于安卓操作系统的天气预报应用程序能够一定程度的顺应时代的潮流。目下应用程序市场上,也有一些类似于天气预报的应用程序。当然也很大程度上给人们提供了便利,让人们掌握天气资讯,快捷出行,平安出行。2工程需求分析2.1功能分析〔1〕要有良好效果的界面在安卓应用程序开发当中,有一个重要的参考指标是用户界面〔UI〕,一个良好的,人性化的,合理化的交互界面能够给用户“眼前一亮〞的感觉,有一个比拟绚丽的界面,能一定程度上吸引用户,增加该应用产品的下载量和使用量。天气信息的查询功能作为一个天气预报的应用程序,天气信息的查询当然是要实现的。在程序中是通过WebService效劳,从中国气象局获取所需要的,例如该城市的简单介绍,旅游概况等等。查询的城市的天气信息,实况信息以及未来两天的天气信息。通过一定的解析处理,通过解析获取我们所需的信息,然后交由Activity显示出来。附加信息在设计时,可以增加定位和网络检查功能。另外,在查询一个城市时,可以查出该城市的一些附加信息。操作简单任何一款软件,如果他的操作要是繁琐复杂,也失去了原本的定位价值,就无法占据一定的市场份额,从而得不到原有的意义。2.2性能分析 〔1〕优化Java代码安卓的应用程序都是用Java开发的,选择算法要比实现算法更加重要。要利用简单的技术比方缓存和减少内存分配来极大的优化应用程序。一个非常重要的性能指标是能够让应用程序随时的保持响应。提高性能在代码中使用较少的内存,提高运行速度和效率,除此之外还要利用CPU的设计方式,内存分配方式和内存访问,这些都会对内存访问有性能的直接影响。利用多线程安卓应用程序使用的是java编程语言,采用多线程编程,这样有一个好处就是可以及时的响应用户,也能提升安卓设备的性能,减少响应的时间。降低功耗我们在编写应用程序时要注意功耗问题,要确保应用程序使用电量是合理的。现在的智能都由有限容量的电池来供电,因此是否能够节能成为了一个重大的性能指标,过于消耗电能的应用程序将会被广阔的用户遗弃,要做到在不影响程序性能的情况下最大的减少功耗。2.3平安分析安卓的平安设计原那么在安卓平台上运行的程序是肯定没有权限,也是不能够执行一些操作来损坏操作系统和其他的应用程序,这是开发安卓应用程序默认的情况。不能对用户的私人信息或数据进行读写更改,不能对其他应用程序所属的文件进行读写,或者其他更改操作。另一个注意的点是,不能对其他正在运行的应用程序进行一定的干扰,安卓的应用程序都是在一个属于自己的空间中运行,我们所开发的应用程序不能对其他应用程序进行一些危害性的操作,除非有特殊的权限,能够请求其他程序进行相关的操作处理,这些权限要在应用程序中呗声明为静态。〔在安装时系统会预先提示〕安卓数据平安原那么安卓的平安原那么指出,默认情况下,除非系统授权外,安卓操作系统的数据是不会被其他的程序破坏,读写,修改或者删除。安卓在保护数据的完整性和平安性方面,采用的是赋予相应的权限,如果有特殊需要的话,系统在安装的过程中就会审核,看该程序有没有相应的权限,这样也就有效的保护了数据的平安性。2.4研究内容和开发环境需求〔1〕搭建Android开发环境,下载并安装Eclipse,下载并安装androidSDK;并配置好相应的插件ADT、分配一定的运行空间和存储空间来配置Android模拟器。〔2〕充分研究android平台应用程序开发的技术的理论,掌握Android框架下开发应用程序的相关技术与流程。〔3〕开发语言是Java,通过这个应用程序来熟悉多线程编程。〔4〕如何从远端效劳器上获取信息。3工程设计分析3.1程序功能模块图根据功能需求分析,在这个工程中总共设计了以下功能:〔1〕显示功能,可以显示当天的天气状况,明后两天的天气信息,以及该城市的简单介绍。〔2〕查询功能,作为一个天气预报的应用软件,查询天气是最根本的功能,在这个工程中设计了利用城市名来作为简单的查询方法。〔3〕定位功能,这个功能的主要作用是在用户翻开这个程序时,就会显示用户所在地的天气信息。除此之外,还有一些附加的功能,比方检查网络设置等。〔如图2所示〕CCHENWEATHER显示信息查询定位显示三种信息按照城市名查询获取当前位置信息图3-1功能模块3.2显示信息设计 在这个工程中主要设计了以下几类信息:〔1〕日期,分别是今天,明天和后天的日期〔例如5月1日〕。〔2〕天气情况,这中间包括了天气、气温、风力。而且还有明天,和后天的天气情况。〔3〕各项指数,比方穿衣指数、旅游指数、运动指数、紫外线指数等等。〔4〕城市介绍,简单的介绍该城市的历史、开展和旅游情况等。3.3解析数据由于在这个工程中,所用的信息,如定位功能是从基站获取的信息,比方天气信息是从WebXml这个网站,而该网站是从中国气象局获得的。在获取天气等信息时采用的是Soap协议,调用接口,直接从预先设置的网站WebXml获取。在获取信息后就要解析数据,并将数据赋给相应的变量。然后在Activity中显示给用户,根据需求,解析了天气信息,明天和后天的天气状况,以及该城市的介绍。然后分别在几个界面中显示。3.4界面设计在这个工程中,设计了几个界面,主要包括有:程序启动时所展示的画面,之后是启动完成后时显示的界面,也就是信息的主界面,其次是用于显示明天和后天天气信息的界面〔NextPaga界面〕,第三个界面是用于显示城市介绍信息〔PreviousPage界面〕最后一个是查询界面,用户可以在这个界面上输入要查询的城市,然后在信息界面获取天气信息。在界面设置时,要注重界面的友好性,靓丽性和实用性。友好性,是指界面布局简单,操作简易,不会繁琐多余。靓丽性,尽最大的能力将界面设置地更为绚丽,这样也会随之提高应用程序的价值。除此之外,还要注重一点是增加界面的信息量,在有限的空间内将信息合理地,尽可能多的显示出来,让用户阅读信息,这就是实用性。下面分别介绍工程中几个界面设计。3.4.1程序启动界面在程序启动界面中,采用“导航设置〞,模仿了市场上一般的应用软件的设计。在开机时会显示一张图片,在程序休眠一至两秒后启动另一个画面,在这个画面中会根据用户的选择,向左或者向右滑动时会显示前一张图片或者是下一张图片,总共会显示四张。在这个过程中,除了显示第一张图片时没有能显示它的前一张图片和在第四张图片时不能显示它的下一张图片,其他的都可以根据选择显示前一张或者下一张图片。在显示第四张图片时,如果继续向左滑动〔实际是跳转到下一页的功能〕时,会跳转到信息的主界面中。3.4.2信息界面之主界面〔MainPage〕当进入到这个界面时,可能会停滞一会,因为程序会在启动这个界面时,会进行一些获取信息的操作,然后当信息获取成功后会显示设计的布局中。在这个界面中,会显示有以下信息:地区:查询的城市名,并加一些修饰,如阴影设置,字体大小和颜色的设置,用于和其他信息进行区分。日期:当天的日期,格式为--月--日。天气:当天的天气情况。天气图片:在天气的有方,显示与当天天气相符的天气图片,如太阳,云朵。气温:格式为当天的最低温度/最高温度,单位是摄氏度。风力:风向和强度大小。指数:有各项指数,包括穿衣指数,过敏指数等等。天气实况:指查询时刻的天气情况,包含有空气质量,以及紫外线强度,湿度,天气,温度。导航按钮:有三个小按钮,其中中间一个是标为蓝色按钮的代表当前页。菜单按钮:用点击这个按钮时,可以进入到查询界面。背景:通过与查到的当天的天气相匹配,找到一个和预先放到程序中的图片。天气不同,显示的背景不同。滑动切换:左右滑动切换到信息界面二〔NextPage〕或者信息界面三〔PreviousPage〕。在滑动时有一定的动作效果。3.4.3信息界面之二〔NextPage〕在这个界面中,设计了用来显示未来两天大概的天气情况,即明天和后天的天气。具体的显示信息有以下几局部:标题:未来天气。天气图片:和主界面中的天气图标类似,这里是根据明天的天气情况来设置的。明天的天气:这里会显示明天的天气情况,包括日期,天气,气温和风向风力等情况。后天的天气:显示的内容和明天的天气相同。天气图片:用于显示和后天天气相符的图片。导航按钮:有三个小按钮,其中最右边的一个是标为蓝色的按钮代表当前页。滑动切换:当用户向右滑动时,可以切换到信息的主界面中。3.4.4信息界面之三〔PreviousPage〕在这个界面中,设计了用来显示城市大概的介绍,包括旅游情况和城市的开展历史。具体的显示信息有以下几局部:标题:城市介绍,设置字体大小和颜色。介绍内容:主要是显示所查询城市的开展历史,著名的旅游景点等信息。导航按钮:有三个小按钮,其中最右边的一个是标为蓝色的按钮代表当前页。滑动切换:当用户向左滑动时,可以切换到信息的主界面中。当用户继续向右滑动时,会切换这个界面的背景,到达一定的绚丽性。3.4.5查询界面当用户在信息的主界面中点击菜单按钮后,就会进入查询界面。在查询界面中,主要设计用于查询用户输入的城市的天气信息,主要包括以下几局部:检查网络按钮:用户可以用来检测当前的网络状态。用一个图片作为这个按钮的背景,当用户点击该按钮时,会显示当前的网络状态,或者返回获取失败。定位按钮:用于获取用户当前的位置。同样会用一个图片作为这个按钮的背景,当用户点击这个按钮时会显示一个圆形的进度条,在这个进度条中会显示“小陈正在努力为您获取...〞,如果获取用户当前位置成功时,会显示一个对话框,在对话框中会显示“ChenWeather欢送您〞和一个用于进入天气界面的按钮,在此同时会在屏幕的下方会显示用户所在的位置。作者信息:在这里加了我本人的一点信息,在屏幕的中下方会显示“ChenWeather〞、“陈士杰〞和“电子仪器10-1班〞。输入信息框:在屏幕的最下方会有一个输入框,用于用户输入所查询的城市,在这个框中,默认的是显示“请输入要查询的城市〔如:北京〕〞,并对这个输入框进行了背景设置,同时设置了用户输入城市时文字的颜色和大小。查询按钮:顾名思义,这个按钮是供用户在输入城市后,进行查询天气信息的按钮,这个按钮和输入信息框都放在最底部,并列而置。背景设置:这个界面的背景在安桌应用程序的配置文件中设置,不做过多的设计。3.5算法流程图关于工程的算法流程图,将在分别在信息显示模块和查询模块来进行描述。显示模块,主要是运行这个程序时,通过定位获取当前位置,然后得到当前位置的天气信息,并将结果信息显示出来,流程图如图3所示:查询模块,主要是得到要查询的城市名,然后进行查询,将得到的信息交给显示模块来显示,流程图如图4所示:跳转到NextPage跳转到NextPage退出向右滑动切换背景查询跳转到PreviousPage进入查询模块向右滑动切换到主界面向左滑动切换到主界面显示信息解析天气信息获取天气信息获取地址成功显示程序启动界面显示完成Y显示信息主界面网络是否连接开始结束获取用户所在地址NNYY图3-2显示模块流程图判断合法?判断合法?获取当前的网络状态开始进入查询界面获取用户当前所在地获取所查询的城市检测当前的网络状态显示位置信息显示网络状态信息网络是否连接YN解析天气信息获取天气信息显示信息进入显示模块结束退出YN图3-3查询模块流程图4工程实现在工程实现方面,将以程序运行、界面显示、天气查询、定位、一个后台运行的Service、以及下拉刷新等方面,来进行适当的描述。4.1启动画面在这个工程中,在MainActivity.java文件中建立了一个类,在该类的onCreate方法中设置它的布局变量,并在配置文件中注册一下,声明该布局文件是程序启动时显示的界面。publicclassMainActivityextendsActivity{//一个ImageView控件变量,是用来显示背景图片 privateImageViewimageview; protectedvoidonCreate(BundlesavedInstanceState){//给这个Activity设置相应的的布局文件 setContentView(R.layout.activity_main);imageview=(ImageView)findViewById(R.id.iv);//声明一个Intent的变量,用来启动Welcom这个类 finalIntentintent=newIntent(this,Welcom.class); Timertimer=newTimer();//创立一个时间任务队列,在这个队列中,先休眠3*1000ms,然后再执 //行run(),启动Welcom timer.schedule(newTimerTask(){ publicvoidrun(){ startActivity(intent); finish(); } },3*1000);}}在AndroidManifest.xml文件中注册。android:name="com.example.weatherdemon.MainActivity"<!--声明这个布局文件是开启时就显示--><actionandroid:name="ent.action.MAIN"/><categoryandroid:name="ent.category.LAUNCHER"/>然后就会启动Welcom类,在这个类中会显示四张通过滑动选择的图片。Java文件如下:publicclassWelcomextendsActivity{//声明一些变量,此处省略。//点击事件函数 publicbooleanonTouchEvent(MotionEventtouchevent){ switch(touchevent.getAction()){ //当用户手指点击屏幕时,按下的动作,记录下手指所在的坐标。 caseMotionEvent.ACTION_DOWN:{ oldTouchValue=touchevent.getX(); break; } //当用户手指离开屏幕的动作,记录这个时候手指所在的坐标 caseMotionEvent.ACTION_UP:{ floatcurrentX=touchevent.getX();//代表向右滑动,显示前一个画面,第一画面除外。 if(oldTouchValue<currentX){ i--; if(i>0){//设置画面切换时的动作和我们看到的背景图片 mVf.setInAnimation(Welcom.inFromLeftAnimation()); mVf.setOutAnimation(Welcom.outToRightAnimation()); mVf.showPrevious(); } if(i<1) i=1; }//设置屏幕下方的导航按钮 setImageView(i); if(oldTouchValue>currentX){ if(i==4){//当画面在第四个的时候,如果继续向左滑动,将启 //动Weather类,进入显示界面 Intentintent=newIntent(this,Weather.class); intflag=1; intent.putExtra("fist_time_flag",flag); startActivity(intent); finish();} i++; setImageView(i); mVf.setInAnimation(Welcom.inFromRightAnimation()); mVf.setOutAnimation(Welcom.outToLeftAnimation());//显示下一个画面 mVf.showNext(); } publicvoidsetImageView(inti){ if(i==1) {//通过设置ImageView控件变量,来显示四个导航按钮 iv1.setImageResource(R.drawable.guide_dot_selected); }4.2信息界面显示实现在代码中,没有具体的在一个文件中实现一个功能,这也是代码的一个重要的缺点,耦合程度高,独立性较差。这也是在今后的学习工作中要花比拟大的精力来改善代码的耦合性。显示模块中,主要的代码是在Weather.java、NextPage.java和PreviousPage.java文件中,以下是对显示模块中三个主要的文件进行分析:4.2.1Weather在这个文件中,创立了一个Weather类,主要的工作都是由这个类完成的。当用户进入到这个类时,首先是进入onCreate方法,在这个方法中先进行一些类似初始化的工作。在这个函数中会启动GetWeatherService这个效劳,并和它进行绑定,提供天气查询的功能。protectedvoidonCreate(BundlesavedInstanceState){//启动GetWeatherService,来获取天气信息 startService=newIntent(this,GetWeatherService.class);//设置下拉刷新时的显示界面,然后再设置mPullScrollView的监听函数 mPullScrollView=newPullToRefreshScrollView(this); //开一个handle消息处理函数,采用的匿名内部类 handler=newHandler(){ publicvoidhandleMessage(Messagemsg){ switch(msg.what){//当程序运行功能界面时会首先选择这个情况 casefist_time://首先会调用函数检测网络的连接状态 if(!getNetworkState(Weather.this)){} //从基站获取用户所在地的经度和纬度 itude=getLocation(); //然后调用这个函数从谷歌地图中获取当前所在的城市 addr=getAddr(itude); //这个函数会开一个线程,通过binder通信,与 //GetWeatherService建立联系,获取天气信息,runThread();} //定义一个ImageButton,并为它设置监听函数,这个控件就是在信息界 //面中显示的菜单按钮,通过它可以进入查询界面 imageButton=(ImageButton)findViewById(R.id.ibutton); imageButton.setOnClickListener(newView.OnClickListener(){//在这里设置了一个匿名内部类,如果用户点击了这个按钮,那么会 //通过Intent跳转到GetInfo类 publicvoidonClick(Viewv){ Intentintent=newIntent(Weather.this,GetInfo.class); startActivity(intent);}//这个函数是用来获取一个GetWeatherService类中的一个内部类 //MyBinder的实例,运用的是binder通信机制,由操作系统调用 //conn的一个连接函数返回实例 bindService(startService,conn,Service.BIND_AUTO_CREATE);}//这个函数是在这里,当Activity的生命周期onCreate等方//法都完成后才由操作系统调用,成功后返回一个GetWeatherService的实例 publicvoidonServiceConnected(ComponentNamename,IBinderservice){ igetweather=(IGetWeather)service; Log.d(TAG,"Getigetweather="+igetweather); } //这个run方法是GetWeatherInfoThread线程的执行函数,用来获取天气信息publicvoidrun(){ try{//这个循环在这里至关重要,让这个线程休眠假设干个10ms,目的 //只有一个:让主线程中的bindService完成绑定,返回实例igetweather do{ //调用线程的休眠函数,休眠假设干个10ms }while(null==igetweather);//在这个函数中会调用GetWeatherService中的函数 GetWeatherInfo(city);}} publicvoidGetWeatherInfo(Stringcityname){ WeatherInfoweatherinfo=null; try{//调用service中的函数,实际上是调用IGetWeather接口中的接口函//数,这个接口是在Service中实现的 weatherinfo=igetweather.getweatherinfofromservice(cityname);}//然后发送消息,在消息处理函数中被处理,实际的功能时,调用内部 //函数将获得的信息显示出来 Messagemsg=newMessage(); msg.what=mainpage; msg.obj=weatherinfo; handler.sendMessage(msg);} casemainpage://当获取天气信息后,会发送消息,在此进行处理 weatherInfo=(WeatherInfo)msg.obj; if(weatherInfo==null){//会进行平安判断//显示当天的信息,就是将对应的控件设置获取的天气信息 showResult(weatherInfo,mainpage); //根据当天的天气信息来设置天气图标和背景 setImage(weatherInfo.today);这里的WeatherInfo是代表天气信息的一个类,包含与天气相关的各种信息,如表1:表4.2.1-1:WeatherInfo成员变量的含义类型变量名保存的信息Stringcity城市名Stringweather天气状况Stringtem温度Stringwind风向和强度Stringdate日期Stringmesg各项指数,如穿衣指数Stringnowinfo天气实况Stringtomorrow明天的天气信息StringafterTom后天的天气信息Stringintro城市的介绍信息4.2.2NextPage当用户向左滑动屏幕时,界面会进入NextPage,在这个界面会显示明天和后天的天气情。//在主界面中,会将明天和后天的天气情况用intent成员函数来填装数据,然后在//startActivity()后将intent传到NextPage类中。在这个类中将信息显示出来casenextpage: Intentnextintent=newIntent(Weather.this,NextPage.class); nextintent.putExtra("tomorrow",weatherInfo.tomoarry); nextintent.putExtra("after_tom",weatherInfo.afterTom); startActivity(nextintent);//根据每一天的天气情况来设置天气图标,用flag来将背景设置和明天的 //天气相符的图片 publicvoidSetImageRsr(Stringweather,ImageViewiv){//从传入的信息中解析出明天和后天的“天气〞对应的实际情况 str=weather.substring(start+2,end-4); if(str.equalsIgnoreCase("晴")){ if(flag==1){//这个flag主要是用来将界面的背景设置和明天的天气情况相对 //应的图片。调用的线性布局的对象的系统函数。图片是放在 //工程文件下的layout目录中的drawable的目录中。图片会在R文 //件中自动生成一个Id layout.setBackgroundResource(R.drawable.summary); flag++;}//设置与天气相对应的图标 iv.setImageResource(R.drawable.a_0);当用户向右滑动,切换到主界面时,会调用函数finish()来结束这个NextPage,让界面重新显示主界面。4.2.3PreviousPage当用户在主界面时,向右滑动界面,这时会进入PreviousPage界面,在这个界面中会显示该城市的开展历史和旅游介绍。同样,在Weather中会将城市的介绍信息放入intent中,然后传入PreviousPage类中,然后显示。当用户继续向右滑动界面时会切换这个界面的背景。当用户向左滑动界面时,会进入信息的主界面。除此之外,在这里又创立了三个Activity,当然会有对应的布局文件,这些布局文件都要在配置文件中进行注册,之后才能引用这些布局。4.3天气查询在这界面中设计了查询功能,检测网络连接状态,定位用户当前所在的城市,其中检测网络和定位功能在显示模块中均已介绍。将解释分析查询功能。先是声明定义一个editText控件和button控件,分别是用来得到用户输入的城市和点击查询信息。 eCityName=(EditText)findViewById(R.id.editText1); querybutton=(Button)findViewById(R.id.button3);然后再给其设置一个监听事件,实现监听函数接口onClick() publicvoidonClick(Viewv){ Stringcityname=null; cityname=eCityName.getText().toString(); if(cityname.equalsIgnoreCase("")){//对用户输入的城市进行判断,尽可能的判断输入的是合法的。 } if(!getNetworkState(GetInfo.this)){//检测当前的网络状态,主要是获取一个TelephonyManager的一个 //实例,通过调用这个实例的一个接口函数getNetworkType,获取当前 //中sim卡的运营商,再进一步判断网络。第二中就是判断 //wifi连接状态,} //声明一个Intent来启动天气信息显示的主界面 //在这个Intent对象中添加用户输入的城市名 intflag=0;//标志是指由查询进入显示界面 intent.putExtra("fist_time_flag",flag); //最后启动这个天气信息显示主界面类}此外,还在这个界面显示了关于本人的一些信息,用的是一个TextView控件,然后对空间进行设置内容。4.4GetWeatherService这个Service是用来为Weather这个类提供效劳的。采用的是binder通信机制在类中,构建一个内部类MyBinder,让它实现一个定义的一个接口。//用于效劳和活动的通信,必须要复写onbinder()函数,这个函数在bindService(〕//运行时会返回一个调用效劳的接口,也就是下面的这个变量。MyBinderbinder=newMyBinder();//这个函数是复写父类的onBinder,在绑定效劳时会由操作系统调用publicIBinderonBind(Intentintent){ returnbinder;}//IGetWeather是定义的一个接口,接口里只有一个函数,在这个效劳中被//实现,然后可以在Weather中得到IGetWeather的实例。publicclassMyBinderextendsBinderimplementsIGetWeather{ publicWeatherInfogetweatherinfofromservice(Stringcityname){//调用函数getResult,在getResult中开一个线程来获取天气信息。 weatherInfo=getResult(cityname);//最后将获取的天气信息返回给Weather类 returnweatherInfo;}}在线程的执行函数run中会调用函数,从WebXml网站这个webservice效劳中获取天气信息。代码分析如下:publicWeatherInfogetWeather(StringcityName){ //在获取天气中遵循的是soap协议, WeatherInfoinfo=newWeatherInfo();//指定Webservice的命名空间和要获取信息时调用的Webservice的方法名 SoapObjectrpc=newSoapObject(SERVICE_NAME,METHODNAME);//设置调用方法参数值,cityName就是我们要查询的城市名 rpc.addProperty("theCityName",cityName); //生成调用WebService方法的soap请求信息,该信息是由下面这个类来 //描述。Serialization:序列化,Envelop:封装 SoapSerializationEnvelopeenvelope=newSoapSerializationEnvelope( SoapEnvelope.VER11); envelope.bodyOut=rpc; envelope.dotNet=true; envelope.setOutputSoapObject(rpc);//通过HttpTransportSE类的构造函数可以指定Webservice的WSDL的文档的URL HttpTransportSEht=newHttpTransportSE(SERVICE_URL); ht.debug=true; ht.call(SOAP_ACTION,envelope);//使用getResponse方法获取WebService方法的返回结果 detail=(SoapObject)envelope.getResponse(); //解析获得的信息 info=parseWeather(detail,cityName);}在解析时,由于soap协议,将获取的信息都转换为字符串类型,所以在解析时主要就是根据转换后的数据信息来解析得到所需要的。以下分析一局部解析函数的代码: tmp=detail.getPropertyAsString(6).toString(); info.date="日期:"+tmp.split("")[0]; info.weather="天气:"+tmp.split("")[1];这里的detail是SoapObject对象,这个detail相当于一个数组,第一条语句的意思是取出detail中的下标为6的数据,并转换为String类型,将结果赋给tmp,tmp.split(“〞)[0]是指首先将tmp里的字符串以空格为结束符,分为字符数组,[0]就是指数组的下标,这样就获得了日期和天气的信息了。其他的信息获取时方法类型。还有一点是这个效劳也要在配置文件中注册。<serviceandroid:name="com.example.weatherdemon.GetWeatherService">//定义了启动这个效劳的action<actionandroid:name="com.example.weatherdemon.WEATHER"/>4.5下拉刷新在下拉刷新中,其实主要的还是调用系统函数。其中,要获取三个值,第一个是当下拉到某个临界值值后能够执行刷新命令,第二个值是下拉的最大值,第三个值是用户下拉的值。 privatevoidrefreshLoadingViewsSize(){ //得到header的内容高度,将作为拖动刷新的一个临界值,假设拖动 //距离大于这个高度,那么松手后,触发此刷新操作 intheaderHeight=(null!=mHeaderLayout)?mHeaderLayout .getContentSize():0; mHeaderHeight=headerHeight; //这里得到Header和Footer的高度 //因为header和footer是完全看不见的 headerHeight=(null!=mHeaderLayout)?mHeaderLayout .getMeasuredHeight():0;}同时还要设置下拉的监听事件,如果符合条件就会进行刷新操作。caseMotionEvent.ACTION_DOWN: //记录按下时的y坐标 mLastMotionY=event.getY();caseMotionEvent.ACTION_MOVE: //计算差值 finalfloatdeltaY=event.getY()-mLastMotionY; //得到绝对值 finalfloatabsDiff=Math.abs(deltaY); //这里有三个条件: //1,位移差大于mTouchSlop,这是为了防止快速拖动引发刷新 //2,isPullRefreshing(),如果当前正在下拉刷新的话,是允许向上滑动,并把刷新的HeaderView挤上去 if(absDiff>mTouchSlop||isPullRefreshing()){ mLastMotionY=event.getY(); //第一个显示出来,Header已经显示或拉下 if(isPullRefreshEnabled()&&isReadyForPullDown()){ //0:表示当前滑动的偏移量的绝对值大于0,表示当前HeaderView滑出来了或完全 //不可见,存在这样一种case,当正在刷新时并且RefreshableView已经滑到顶部,向上滑动,那么我们期望的结果是 //依然能向上滑动,直到HeaderView完全不可见 //2,deltaY>0.5f:表示下拉的值大于0.5f mIsHandledTouchEvent=(Math.abs(getScrollYValue())>0||deltaY>0.5f); //如果截断事件,我们那么仍然把这个事件交给刷新View去处理,典型的情况是让ListView/GridView将按下 if(mIsHandledTouchEvent){ mRefreshableView.onTouchEvent(event); }5工程调试和效果分析5.1工程调试分析在这个工程中,我遇到了很多困难,比方新建了一个Activity,同时创立了与之相对应的布局文件,但是没有在配置文件AndroidManifest.xml中进行注册,导致在程序运行到那个Activity时就会出现crash。在从WebService中获取天气信息时要进行几部操作,最终才能成功获取。还有一个是我在工程快结束时发现的,当用户进入信息主界面时,程序会获取用户当前的位置,出现了一个情况,就是获取网络状态时,没有对出现的所有的状况进行分析判断,导致在程序运行后,不能显示用户当前所在城市的天气信息。调试信息如图5:在获取位置时,导致阻塞在getLocation函数里面在获取位置时,导致阻塞在getLocat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论