基于Android的天气预报APP

BrotherTeam

发布日期: 2019-05-18 15:31:02 浏览量: 714
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

摘 要

随着移动通信技术的发展和无线数据业务的进步,手机已被赋予了除通话以外的其它许多功能。全新的手机软件领域已逐渐聚焦了众多软件开发商的目光,软件开发者和软件用户将共同面临这个振奋人心的新境界。

本设计使用Android设计技术开发了一种运用在Android系统上的手机天气预报软件系统,本系统通过选择城市来获得天气,风向,风向,温度等信息。基于手机的天气预报系统软件可以使用户对于各地的天气情况的实时掌握,极大的方便了用户的出行和行程安排,避免了不必要的麻烦,具有很强的实用性。

关键词:Android;手机天气预报软件。

Abstract

With the development of science and technology, the mobile terminal gradually into the people’s attention, related to more widely, and play an increasingly important role in people’s daily lives. Therefore, the development of critical applications has become an important factor in the popularity of the mobile terminal, the design and development of practical, convenient application is of great significance and good market prospects. Android as the most popular operating platform, naturally, there are a lot of demand for application services.

The study of this topic is the weather software, based on the Android platform is designed to help the user to query weather information and weather changes anytime, anywhere, to make life more comfortable and convenient. This paper describes the software interface design of the Android platform under the weather and exception handling part, including the contents of the interface implementation, the use of controls, the layout of the interface, and exception handling, combined with weather data of the China Meteorological Association, will be accurate weather conditions presented to the user-friendly way, allows the user to experience more enjoyable the service of this software.

KEY WORDS:Android,interface,control,weather software

1 绪论

Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2012年11月数据显示,Android占据全球智能手机操作系统市场76%的份额,中国市场占有率为90%。2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。

1.1 课题研究内容

本课题研究的是基于Android平台下的天气软件,目的是使用户能随时随地的查询天气信息及天气变化情况,让生活更加舒适方便。本文讲述Android平台下天气软件的界面设计以及数据的获取和解析,主要包括界面的实现,控件的使用,界面的布局和数据处理等内容,结合中国气象网的天气数据,将准确的天气情况以友好的方式呈现给用户,使用户更加赏心悦目的体验本软件的服务。通过对界面的布局及控件的应用等相关内容的学习,使我们对Android平台下界面开发工作有一个初步的了解,并且经过这次开发过程,能够基本掌握这些内容。

1.2 课题研究需求分析

课题研究需要达到的基本要求:

  • 能够查询城市的天气情况

  • 系统能通过手机查看并显示天气数据

  • 系统必须具有安全性,可靠性,独立性

1.3 研究目的和意义

天气软件是一种非常实用的信息服务,随着智能手机的不断普及,各种智能手机平台下都有各种各样的天气软件。Android作为现在主流的智能手机之一,自然也需要这方面的软件。天气关系到人们的日常生活,如告知温暖,方便出行等。一款简单实用的天气软件会很吸引用户。

基于Android平台的天气软件已经有很多,经过分析,用户第一眼往往是一个软件的外观,一个好看的界面才能让用户以一种爱美之心去尝试,才能进一步了解一个软件的好坏,所以吸引眼球的界面是争取用户的第一步。因此,界面设计工作对应用程序来说非常重要,在界面上吸引了用户,才能进一步让用户体验应用程序中的功能,使用这个软件。

1.4 研究前景

Android最吸引人的特点是开源特性,因其开源,允许所有人对其代码进行开发和修改,同时又由于其代码的简单易学性,Android在全世界拥有众多的粉丝。Android在中国的前景十分广阔,首先是有成熟的消费者,在国内,Android社区十分红火,这些社区为Android在中国的普及做了很好的推广作用。国内厂商和运营商也纷纷加入了Android阵营,包括中国移动,中国联通,中兴通讯,华为通讯,联想等大企业,同时不仅仅局限于手机,国内厂家也陆续推出了采用Android系统的产品,我们可以预见Android将会被广泛应用在国产智能上网设备上,将进一步扩大Android系统的应用范围。

Android采用了软件层(Software stack)的构架,主要分为三个部分。底层以Linux为内核作为基础,由C语言开发,只提供基础功能,中间层次包话函数库和虚拟机,由C++开发。最上层是各种应用软件,包话通话程序,短信程序。应用软件可以由各公司或个人自行开发,以JAVA编写。

2 Android开发环境及平台搭建

2.1 Android开发环境介绍

Android平台使用Java编程语言来开发应用程序,而Android提供了对Java的核心支持。考虑到Java虚拟机的执行效率和占用资源情况,Google重新设计了Java的编译器,命名为Dalvik。Dalvik是经过优化的Java编译器,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行,独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

项目的开发在Eclipse环境中进行,由于进行的是Android应用程序的开发,需要在Eclipse安装ADT插件,即Android开发工具,这样Eclipse就可以和Android SDK建立连接,在Eclipse中启动Android模拟器、调试程序等工作。

由以上分析可知,Android平台的搭建需要Android SDK、Java SDK、Eclipse和ADT四个软件。

2.2 Android开发平台搭建

在进行Android应用程序的开发前,要先搭建Android平台,然后才能在开发环境中进行编程。根据官方指导,对Android平台的搭建过程介绍如下:

STEP1:在官方网址上下载JDK6.0并安装,网址是:

  1. http://www.oracle.com/technetwork/java/javase/downloads/index.html

安装后设置系统环境变量JAVA_HOME、CLASS_PATH、PATH的值;

STEP2:在官方网址上下载更新的SDK进行安装,官方网址为:

  1. http://development.android.com/sdk/index.html

下载完后解压到指定文件夹,启动SDK Manager进行安装,选择需要的Android版本,然后更新,这次更新需要的时间比较慢,所以更新前要做好准备。安装完成后,将ADB命令所在的目录platform-tools的完整路径添加到系统的环境变量PATH中,就能够在命令中使用ADB命令了;

STEP3:接下来要安装的是ADT插件,即Android开发工具。因为ADT在线安装容易遇到问题,增加一些不必要的麻烦所以需要下载后在本地安装。指定网址为:

  1. http://development.android.com/sdk/index.html

STEP4:下载Eclipse,建议选择Eclipse3.4以上版本,网址为:

  1. http://www.eclipse.org/downloads/

解压到指定位置后运行,选择Eclipse菜单中的Help>Install New Software选项卡上的Available Software,点击右侧的Add,然后在Name框中填写Android,在Location框中选择上步下载的ADT文件,然后点击OK>Finish>Install All,这时关闭Eclipse再重新启动。重启后选择Eclipse菜单中的Window>Preferences,在左侧的Android项目中SDK Location中填入Android SDK解压后的目录,然后点击Apply。

至此,整个平台的搭建工作就完成了,可以进行相应的安卓应用开发。

3 项目分析

3.1 用户界面分析

根据应用程序的功能需要,对用户界面做如下分析:

实时天气界面:显示城市当前的实时天气状况,包括城市名称、城市名片、天气情况、温度高低、星期等信息。界面左边有一列城市列表,显示中国各个城市名称,当用户想知道哪个城市的天气情况时,点击这个城市名就可以获取天气状况,考虑到使软件占用尽量小的内存,软件去掉了不必要的花哨,显示城市名称,城市名片,温度和天气情况,同时对未来6天的天气情况简要描述,简要显示星期、天气描述、温度高低等数据,使用户一目了然,使人们及时了解天气变化,对日常生活出行、穿衣做好准备。

3.2 相关技术介绍

3.2.1 Activity

在Android应用程序中,一个活动Activity通常就是一个单独的界面。每一个界面都被实现为一个独立的类,并且从Activity基类中继承而来,Activity将会显示由空间组成的用户接口,并对事件做出响应。大多数的应用都是由多个Activity显示组成。

简单的说,Activity代表一个用户所能看到的界面,主要用于处理应用程序的整体性工作,例如,监听系统事件如按键事件、触摸屏事件等,为用户显示指定的View,启动其他Activity等。所有应用的Activity都继承于android.app.Activity类,该类是Android提供的基层类,其他的Activity继承该父类后,通过父类的方法实现各种功能,这种设计在其他领域也较为常见。

3.2.2 Intent

Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent,Intent提供了一种通用的消息系统,它允许在你的应用程序与其他的应用程序间传递Intent来执行动作和产生时间。使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。

Intent可以划分为显示意图和隐式意图。显示意图调用Intent,SetClass方法明确制定了组件名的Intent为显示意图,显示意图明确制定了Intent应该传递给那个组件,在同一个应用内部使用的。隐式意图没有明确指定组件名的Intent为隐式意图,Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。

Intent负责对应用中一次操作的动作、动作涉及数据和附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的结构。

3.2.3 Service

如果把Activity比喻为前台程序,那么Service就是后台程序,Service的整个生命周期都只会在后台执行。Service跟 Activity一样也由Intent调用,由于Service在后台运行,所以没有界面,用来处理耗时比较长,而且Service不是一个单独的进程,也不是一个单独的线程。Service有两种类型:

  • 本地服务(Local Service):用于应用程序内部

  • 远程服务(Remote Sercie):用于android系统内部的应用程序之间

前者用于实现应用程序自己的一些耗时任务,比如查询升级信息,并不占用应用程序比如Activity所属线程,而是单开线程后台执行,这样用户体验比较好。后者可被其他应用程序复用,例如天气预报服务,其他应用程序不需要再写这样的服务,调用已有的即可。

Service的生命周期,Service有startService和bindService两种启动Service方法,每种方法Service的生命周期是不一样的。

通过startService()——Service会经历 onCreate —> onStartCommand(),stopService的时候直接onDestroy,如果是调用者直接退出而没有调用stopService的话,Service会一直在后台运行,下次调用者再起来仍然可以stopService;

通过bindService()——Service只会运行onCreate()—>onBind() 这个时候调用者和Service绑定在一起 unbindService的时候onUnbind() —> onDestroyed(),调用者退出了,Srevice就会调用onUnbind() —> onDestroyed()。在这里需要注意的是Service的onCreate的方法只会被调用一次,就是你无论多少次的startService又 bindService,Service只被创建一次。如果先是bind了,那么start的时候就直接运行Service的onStart方法,如果先是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,只能先UnbindService, 再StopService,所以是先start还是先bind行为是有区别的。

3.3.4 Layout布局

布局方式有很多种,比如线性布局(Linear Layout)、相对布局(Relative Layout)、表格布局(Table Layout)、网格视图(Grid View)、标签布局(Tab Layout)、列表视图(List View)和绝对布局(Absolute Layout)。本文设计主要采用相对布局(Relative Layout)、线性布局(Linear Layout),所以就相对布局和线性布局我们来做简单地介绍。

相对布局 Relative:里面可以放多个控件,允许子元素指定它们相对于父元素或其他元素的位置(通过ID指定)。因此你可以按正确的顺序对齐两个元素,或者让一个视图在另外一个下面,居于屏幕中间,左边的中间,等等。元素通过给定顺序来绘制,因此如果第一个元素在屏幕中间,其他以它对齐的元素都会对齐到屏幕中间。同样,因为这个顺序,如果使用XML来指定这个布局,你将引用的元素(为了定位其它视图对象)必须被列在XML文件中,在你通过引用ID从其他视图中引用它之前。其中一些特性直接由元素支持,另外一些由它的LayoutParams成员变量支持(为所有这个屏幕中的元素子类化RelativeLayout,因为所有元素都是RelativeLayout父对象的子元素)。已定义的相对布局RelativeLayout参数是:width,height,below,alignTop,toLeft以及padding[Bottom|Left|Right|Top]和margin[Bottom|Left|Right|Top]。注意其中一些参数明确是相对于其他元素的布局位置,所以它们的数值必须是你的相对位置元素的ID。

线性布局 LinearLayout:线性布局是所用布局中最常用的方式之一,RadioGroup, TabWidget,TableLayout,TableRow,ZoomControls类的父类。LinearLayout可以让它的子元素垂直或水平的方式排成一行(不设置方向的时候默认按照垂直方向排列)。LinearLayout以你为它设置的垂直或水平的属性值,来排列所有的子元素。所有的子元素都被堆放在其它元素之后,因此一个垂直列表的每一行只会有一个元素,而不管他们有多宽,而一个水平列表将会只有一个行高(高度为最高子元素的高度加上边框高度)。LinearLayout保持子元素之间的间隔以及互相对齐(相对一个元素的右对齐、中间对齐或者左对齐)。

LinearLayout还支持为单独的子元素指定weight 。好处就是允许子元素可以填充屏幕上的剩余空间。这也避免了在一个大屏幕中,一串小对象挤成一堆的情况,而是允许他们放大填充空白。子元素指定一个weight 值,剩余的空间就会按这些子元素指定的weight比例分配给这些子元素。默认的weight值为0。例如,如果有三个文本框,其中两个指定了weight值为1,那么,这两个文本框将等比例地放大,并填满剩余的空间,而第三个文本框不会放大。

3.3.5 控件介绍

TextView——文本控件,可以用它来显示文字,就像一个标签一样,对TextView是怎么设置显示的文本,怎样设置字体的大小,字体的颜色,字体的样式。TextView包含以下子类:Button, CheckedTextView,Chronometer,DigitalClock,EditText。

  • android:id —— 控件的标识符

  • android:layout_width —— 设置控件的宽度

  • android:layout_height —— 设置控件的高度

  • android:layout_marginTop —— 设置文本的上外边距

  • android:textSize —— 设置文本文字的的大小

  • android:paddingLeft —— 设置元素左内边距

Button——按钮控件,在button内部可以放置内容,比如文本或图像。<button>与</button>标签之间的所有内容都是按钮的内容,其中包括任何可接受的正文内容,比如文本或或多媒体。例如,我们可以在按钮中包括了一个图像和相关的文本,用它们在按钮中创建一个吸引人的标记图像。不过button禁止使用的元素是图像映射,因为它对鼠标和键盘敏感的动作会干扰表单按钮的行为。下面是Button的部分属性:

  • android:id —— 控件的标识符

  • android:layout_width —— 设置按钮的宽度

  • android:layout_height —— 设置按钮的高度

  • android:textSize —— 设置按钮里文字的大小

  • android:layout_marginTop —— 设置按钮的上外边距

  • android:text —— 设置按钮中的文字

  • android:visibility —— 设置按钮里的元素是否可见

EditText——文本编辑框,TextView的直接子类,所以EditText会继成父类TextView的一些方法。在布局中配置EditText也需同时配置一个Button,这样可以在代码中监听Button的事件,以便获取当前在EditView中输入的内容并且显示出来。在EditView可以限制输入的字符串类型。下面是EditText的部分属性:

  • android:id —— 控件的标识符

  • android:layout_width —— 设置输入框的宽度

  • android:layout_height —— 设置输入框的高度

  • android:layout_weight —— 设置输入框占父控件的比例

  • android:inputType —— 设置输入框内的字符串类型

  • android:hint —— 设置在输入框输入内容前默认的文字

ImageView——标签可以显示任意图像,例如图标,图片等。ImageView类可以加载各种来源的图片,需要计算图像的尺寸,以便它可以在其他布局中使用,并提供例如缩放和着色等各种显示选项,在本文用来显示城市图片。下面是ImageView的部分属性:

  • android:id —— 设置图片的标识符

  • android:layout_width —— 设置图片的宽度

  • android:layout_height —— 设置图片的高度

  • android:visibility —— 设置图片是否可见性

4 天气预报软件界面设计与实现

4.1 Android平台用户界面的实现

Android 提供的可变化的用户界面(UI)开发模块是基于XML 文件的。这些XML 文件放在工程/res/layout 下面。这个目录可包含所有应用程序所需的代码部分,比如图片、字符串、xml 文件。当要使用到这些资源时,在代码目录中打开R.java文件即可。在XML 文件里编辑界面的代码,实现起来不仅方便,使用时也会更加灵活。

在Android 程序设计中要用到一些基本的Android UI 元素,通过使用Views、View Groups 和layouts 可为Activity 创建功能性的、富有直观力的UI.通常是使用Android SDK 中提供的一些控件,进行布局、扩展和定制这些控件,并使用ViewGroups 去组合Views,创建由相互作用的子控件组成的原子的、重复利用的UI 元素。也可以创建自己的Views,来实现显示数据和与用户交互的新途径;或使用一些继承自View Group 的Layout 管理器来组织Android UI中的单个元素到屏幕上。

在一个Android 应用中,用户界面由View 和View Group对象构建。View 与View Group 有很多种类,而它们都是View类的子类。View 对象是Android 平台中用户界面的基本单元。View 类是widgets(工具)类的父类,它们提供了诸如文本输入框和按钮之类的UI 对象的完整实现。View Group 类是Layouts(布局)类的父类,它们提供了诸如流式布局、表格布局以及相对布局之类的布局架构。

View 对象是一个数据体,它的属性存储了用于屏幕上一块矩形区域的布局参数及内容。并负责它所辖的这个矩形区域之中所有测量、布局、焦点转换、卷动以及按键/触摸手势的处理。作为一个用户界面对象,View 同时也担任着用户交互关键点以及交互事件接受者的角色。天气实时预报系统程序功能比较单一,其UI 也相对比较简单,只要有一个显示所有中国城市信息的列表,一个显示城市图片的Imageview即可。为了建立Android 平台的用户界面,首先要在Package Explorer 窗口中展开Layout 后新建xml 文件,用来对窗口界面进行布局,主要有系统运行的主配置文件activity_main.xml ,listview.xml和weatherfragment.xml。

Layout 是一类特殊的ViewGroup 控件,它们本身没有任何可显示内容,存在的惟一原因就是其中的内部结构,能够更好地摆放它的子控件。比如Linearlayout,可将子控件按水平或垂直方向按顺序排列下去;Tablelayout,可以将子控件按照表格的形式,一枚枚放置好;Relativelayout 更灵活,可以设定各个控件之间的对齐和排列关系,适合定制复杂的界面。有了Layout 的存在,控件和控件之间不再是割裂地存在,而是更有机地结合在一起,设定起来也更为方便。在activity_main.xml 文件中主要是添加一些界面的布局设置。

4.1.1 主要的项目工程文件

为了给用户清晰,直观的体验,界面设计要做到简明,友好,因为考虑到各个城市的不同特点,所以给每个城市添加一张城市名片的图片,能使用户感觉更加友好,界面左边是城市列表,用户可以选择具体城市查看天气信息。考虑到软件的简洁明确性,只设定一个界面用来显示城市和天气信息,weather工程目录结构及其源代码文件如图1所示:

4.1.2 创建中国城市列表

根据天气预报系统功能需求分析,系统启动后,应在主界面上呈现出中国国内所有城市的列表数据,因此需要创建中国城市列表数据,包括获取、解析城市列表数据,并在用户界面上呈现出来。同时为了给用户更好的交互,每个城市对应显示城市名片,通过代码实现,具体代码如下:

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.activity_main);
  5. mLayoutInflater = LayoutInflater.from(this);
  6. cityList = (ListView) findViewById(R.id.citylist);
  7. cityImage = (ImageView) findViewById(R.id.cityImage);
  8. cityName = (TextView) findViewById(R.id.cityName);
  9. cityWeather = (TextView) findViewById(R.id.cityWeather);
  10. cityTemp = (TextView) findViewById(R.id.cityTemp);
  11. viewpager = (ViewPager)findViewById(R.id.viewpager);
  12. citys.add(new City(R.drawable.city1, "桂林", "101300501"));
  13. citys.add(new City(R.drawable.city2, "北京", "101010100"));
  14. citys.add(new City(R.drawable.city3, "哈尔滨", "101050101"));
  15. citys.add(new City(R.drawable.city4, "大连", "101070201"));
  16. citys.add(new City(R.drawable.city5, "南京", "101190101"));
  17. citys.add(new City(R.drawable.city6, "成都", "101270101"));
  18. citys.add(new City(R.drawable.city7, "广州", "101280101"));
  19. citys.add(new City(R.drawable.city8, "乌鲁木齐", "101130101"));
  20. citys.add(new City(R.drawable.city9, "香港", "101320101"));
  21. citys.add(new City(R.drawable.city10, "台北", "101340101"));
  22. citys.add(new City(R.drawable.city11, "沈阳", "101070101"));
  23. citys.add(new City(R.drawable.city12, "呼和浩特", "101080101"));
  24. citys.add(new City(R.drawable.city13, "济南", "101120101"));
  25. citys.add(new City(R.drawable.city14, "西安", "101110101"));
  26. citys.add(new City(R.drawable.city15, "兰州", "101160101"));
  27. citys.add(new City(R.drawable.city16, "武汉", "101200101"));
  28. cityadapter = new CityAdapter();
  29. weatheradapter = new WeatherAdapter(getSupportFragmentManager());
  30. cityList.setAdapter(cityadapter);
  31. viewpager.setAdapter(weatheradapter);
  32. cityList.setOnItemClickListener(new OnItemClickListener() {
  33. @Override
  34. public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
  35. // TODO Auto-generated method stub
  36. selectid = position;
  37. cityadapter.notifyDataSetChanged();
  38. cityImage.setImageResource(citys.get(position).image);
  39. callHTTP(citys.get(position).code);
  40. }
  41. });
  42. cityImage.setImageResource(citys.get(selectid).image);
  43. callHTTP(citys.get(selectid).code);
  44. }

这段代码的作用是在创建城市列表的同时,将城市名称,城市名片和城市接口结合在一起,使得显示的时候同步,具体效果如图2所示:

4.2 天气信息的获取

基于Android 操作系统的天气实况预报系统设计的核心是通过调用通信协议SOAP(Simple Object AccessProtocol)的接口,从Web Service 提供商中提取天气预报的数据信息,为客户端服务。其基本功能是当用户运行天气预报系统程序时,在手机屏幕上显示出中国的城市名称,用户单击任意一个城市名,可获得该城市的天气实时预报信息。为此,需要解决的问题是手机终端从Web 服务器获取了所有类型的数据之后,将这些数据进一步交给Android 手机终端View 组件,在手机界面上显示给用户。

4.2.1 天气信息数据的获取

在开发中我们经常提到”接口”这个词,什么是接口呢?简单的说,接口其实就是一个http地址。一个标准的网络应用肯定需要两个部分,一部分是咱们正在学习的android开发,还有另一部分是服务器开发。

大多数android程序都是基于网络的,比如基本上大家都在使用的QQ手机客户端。那么假设我们现在要开发一个类似QQ的通信客户端。第一步,需要开发一个登录界面来验证用户登录。很显然的,为了验证登录,我们需要和服务器进行通信,把用户输入的用户名和密码传递给服务器,然后服务器来判断这组用户名密码数据是否正确,并返回给客户端,告诉我们用户登录是否成功。
一般接口由三部分组成:接口地址+接口名称+接口参数。比如下面这个是中国气象网提供的天气信息查询接口:http://www.weather.com.cn/data/cityinfo/101300501.html ,该接口提供的数据是实时天气情况,通过这个接口我们可以得到以下信息,如图3所示:

代码实现接口获取数据如下:

  1. // 请求接口
  2. private void callHTTP(final String cityCode) {
  3. // 创建一个runnable
  4. Runnable runnable = new Runnable() {
  5. @Override
  6. public void run() {
  7. // step1 :创建HttpGet, 就是创建我们要访问的接口地址
  8. HttpGet getMethod = new HttpGet("http://m.weather.com.cn/data/"+cityCode+".html");
  9. // step2 :HttpClient, 我们要通过它来将step1创建出来的地址发送给服务器
  10. HttpClient httpClient = new DefaultHttpClient();
  11. try {
  12. // step3: 通过httpClient.execute()方法,我们把url发送给了服务器,
  13. // 而服务器返回的信息就会被保存在HttpResponse中了
  14. HttpResponse response = httpClient.execute(getMethod); // 发起GET请求
  15. // 用EntityUtils.toString把HttpResponse转换成string
  16. String result = EntityUtils.toString(response.getEntity(), "utf-8");
  17. // 将返回的json字符串解析并显示出来
  18. try {
  19. paresJson(result);
  20. } catch (JSONException e) {
  21. e.printStackTrace();
  22. Log.v("TAG", "解析失败 ");
  23. }
  24. } catch (ClientProtocolException e) {
  25. e.printStackTrace();
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. };
  31. // 开启线程执行runnable
  32. new Thread(runnable).start();
  33. }

4.2.2 解析数据

从图3可以看出,我们获得了桂林的天气信息,但是这些数据看着很乱,为了使用户清晰的获得信息,我们可以采用json协议解析数据:

  1. // 将返回的json字符串解析并显示出来
  2. private void paresJson(String jsonString) throws JSONException {
  3. // 首先,把这个字符串转换成jsonobject
  4. JSONObject jsonObject = new JSONObject(jsonString);
  5. // {
  6. // "weatherinfo": {
  7. // "city": "桂林",
  8. // "cityid": "101300501",
  9. // "temp1": "28℃",
  10. // "temp2": "19℃",
  11. // "weather": "多云",
  12. // "img1": "d1.gif",
  13. // "img2": "n1.gif",
  14. // "ptime": "11:00"
  15. // }
  16. // }
  17. // 理解json格式我们可以把它当成window里的文件系统, 大括号表示文件夹
  18. // 假设上面是字符串的内容,
  19. // 那么最外面的"文件夹"里包含着一个叫"weatherinfo"的子文件夹.
  20. // 然后weatherinfo文件夹里包含着许多文件, 有的叫city ,有的叫 temp1,
  21. // city 后面的 "桂林" 表示的是city这个文件的实际内容是"桂林"
  22. //

4.3 在UI上显示天气信息

当获得天气数据之后,就可以把它绑定到activity_main.xml 定义的ListView 组件上,在WeatherFragment.java 中的代码段为:

  1. public class WeatherFragment extends Fragment {
  2. Weather weather;
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. // TODO Auto-generated method stub
  6. super.onCreate(savedInstanceState);
  7. weather = (Weather)getArguments().getSerializable("weather");
  8. }
  9. @Override
  10. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  11. Bundle savedInstanceState) {
  12. // TODO Auto-generated method stub
  13. View view = inflater.inflate(R.layout.weatherfragment, null);
  14. TextView dayTextView = (TextView) view
  15. .findViewById(R.id.time);
  16. TextView tempTextView = (TextView) view
  17. .findViewById(R.id.yubaoTemp);
  18. TextView weatherTextView = (TextView) view
  19. .findViewById(R.id.yubaoWeather);
  20. dayTextView.setText(weather.day);
  21. tempTextView.setText(weather.temp);
  22. weatherTextView.setText(weather.weather);
  23. return view;
  24. }
  25. }

5 软件测试

5.1 天气预报软件在电脑模拟环境下测试

软件编写完成,对其进行测试,首先将手机天气预报系统在电脑模拟环境下测试的方案,以下是对系统进行测试,在Eclipse 的Package Explorer 窗口中用鼠标右键选择weather工程名,在弹出的窗口中选择”Run As”→”Android Application”安装该应用程序到Android 模拟器并启动它,如图4所示:

等待模拟器启动完成软件的安装,然后单击所要查询的城市名称列表项,稍等片刻便会显示出该城市的天气实况信息。电脑模拟测试结果如图5所示:

通过网站查询桂林的天气情况如图6所示:

通过对图5和图6的数据比较,可以知道软件获得的数据是正确的,说明软件的可行性基本满足要求。

5.2 天气预报软件在Android手机下测试

在工程名weather上点右键,然后选择“Run As”,然后选择“Android Application”。进入界面后,选择测试手机,如图7所示:

等待程序安装完成,保证手机连接互联网的情况下,启动后可以得到各个城市的天气信息,如图8所示:

该测试说明开发的天气预报软件可以独立在Android设备运行,满足设计要求的独立性,通过与网络的数据比较,可以发现,天气预报软件获取的数据与实际的天气情况非常接近,说明数据的准确性,实时性;从图9可以看出,当选择不同的城市时,软件可以通过网络获取不同城市的天气信息,说明该天气预报软件可以获取不同城市的气象信息,满足设计要求。

6 总结

在本次Android天气预报软件开发过程中,我通过学校的图书馆资料和网上查询,了解了Android的搭建、Intent、Activity、Service等知识。Android环境搭建的基本工作完成后,本文对界面的控件、布局和美观方面进行设计,对数据获取和解析做了分析,通过模拟器显示城市名片,实时天气情况和未来5天天气情况,这个软件还可以进一步发展,比如“短信预报”、“新闻模块”等功能,如果这些功能都能实现将会对用户有更多的帮助,使他们的生活更加愉悦和方便。Android 智能手机应用程序的开发涉及了它的整个体系结构,是一项非常复杂的工程。

上传的附件 cloud_download 基于Android的天气预报APP.7z ( 6.98mb, 17次下载 )
error_outline 下载需要15点积分

发送私信

回忆,是与往事最美丽的重逢

4
文章数
3
评论数
最近文章
eject