Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

【小项目】简单天气预报项目的实现与流程

$
0
0

 一直有人问我说,一个项目拿到需求以后怎么去实现,还有一个app如何去构思,如何去下手,该从那里去写,这里我来简单的说下,这里我们拿一个最简单的天气预报来说明。

  

宏观上面来看一个项目怎么开发的:

1.首先拿到一个项目后,客户会给你很多他想要的功能和需求,这时候产品经理需要去分析和梳理用户的需求,他会把最终梳理好的需求不断的去和客户沟通确定,最终直到客户的需求明确下来;

2.接着产品经理会将明确下来的需求说给美工,美工进行原型图设计,期间会设计其主题风格,logo,产品流程图等,然后产品经理会再去和客户沟通确定原型图是否符合客户的审美风格,直到客户对所设计的页面等认同,之后美工会给开发人员切图等;

3.所有需求设计图会给项目经理,项目经理再一次细化所有功能需求,并会开会发布新项目的需求,之后会考虑项目的整体架构与研发周期,确定之后将任务下发给程序猿,在开发周期内完成后,在进行不断的项目测试,待测试完成后,与客户交付项目并准备上线,之后的就是维护更新维护更新。

  具体的流程还要看具体的公司,不过大致流程上是这样的,不同的角色考虑不同的任务。

 

程序猿的任务开始

  好了说了那么多了,我们来说说以天气预报为例子,作为一个新手如何来开发吧。

 

首先注意如下几点:

 

1.统一命名,统一书写

  首先新建项目,项目的名字和规定的包名一般公司都是有规定的,如果没有特定的要求,一般都是以“ 域名.公司名.App名字 ”来命名的,当然如果只有你一个人开发的话你可以随意,但是如果有两个人以上时候就需要统一包名了。

  其次统一确定所有的Activity,控件ID,xml布局等命名,不统一的后果会很蛋疼,具体给出一篇博文来参考,仅供参考,你也可以自己来制定:

http://blog.csdn.net/vipzjyno1/article/details/23542617

  除了程序猿之间的命名方式,你还需要要求下美工给你切的图片的名字,明确意思就好。

 

2.选择好的架构

  现在市面上有很多不错的架构,你可以和你的技术团队来选择相应的架构来完成你的项目,但是切记一定要符合,不要随意否则有可能大才小用,很简单的项目使用了很复杂的架构来实现,一定要符合项目,常用的有MCV,MVP

 

3.网络接口(api)的制定

  接口的意思就是说你通过不同的网络请求(常用的get/post)向后台服务器端请求数据,服务器响应后返回给你一些你想要的数据,常用的数据格式有xmljson(解析数据必须要会),这个数据的格式最好来一起制定下;

  还有一种情况可能直接在你开发的时候,后台就给你提供好了数据接口,这时候一定要熟悉开发时候给你的字段,或是哪里的数据不是很好找后台同事去协商处理。

 

4.选择合适你的第三方框架

  很多项目中用到了第三方框架(简单说框架别人封装的一些库,便利开发,或有你想要的服务,例如百度地图api),选择正确的框架还有合适的框架,例如图片框架有些是专注于滑动加载图片的,有的是专注于高质量显示图片的,至于哪个适合你,先了解下再去使用。

 

5.加密保证你的app安全

  现在app的安全越来越值得关注,所以加密的app是至关重要的,几个辛辛苦苦开发的app也许别人只用几秒就KO你的app拿到你的代码了,所以加密至关重要,常用的加密技术有混淆代码,dex加密,第三方加密等,这个具体也要看你的项目,如果有关于政府方面的只能使用混淆等非第三方加密技术,如果公司允许且不涉及政府等项目时候可以使用第三方加密来保证app的安全,常用的有360加固,爱加密;反编译工具有:dex2jarJD-GUI

 

  好了开始来说说天气预报这个简单的小项目吧,也给新人们一个好的思路;

 

 

开始项目

首先项目名,包名等命名假设已经制定好,本项目使用了MVC传统模式进行开发,这样我认为更好理解。

 

SDK最低指定的是4.0  编译版本为7.0

 

需求与原型图:

设计一个天气预报app,显示地区,温度,风力,显示天气信息以及其对应图标,当请求失败时候提示用户失败信息,断网时候提示用户重新连接网络;

原型图如下:


分别为加载完以及未加载状态

 

首先分包如下:

 

 

   如果分包的目录和这种分包不一样可以如下操作

 

  说下分包:

App的入口类是MainActivity我一般不在里面做复杂业务,可以加入闪屏动画处理,其中有些包你可能开发时候根本就用不到,但是最好声明出来,可能在日后用到;

 

Activity:

存放所有的activity

Adapter:

存放所有的适配器

Base:

存放所有的基类,封装所有公共的特性

Bean:

存放所有的实体类

Constant:

存放所有的常量

Net:

存放所有有关网络请求的操作

Utils:

存放所有的工具类

Widget:

存放所有的自定义组件

 

  

编写的思路就是顺序

 

Xml页面 ---------------请求数据------------------显示在页面上

 

写好布局文件以及绑定好控件ID -----编写网络请求工具类--------编写网络请求动作并且解析json数据-----将解析好的json数据显示到xml

 

这里直来讲核心的内容,首先前面的xml编写以及id的绑定就不再阐述,来说下网络以及xml数据获取上面,首先这里我找了一个第三方开源的接口,直接用即可,其链接如下:

 

网络请求 天气预报主站的网址:

 

 http://www.k780.com/api/weather.future

 

天气预报主站给出的示例接口网址:

  http://api.k780.com:88/?app=weather.future&weaid=1&&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json

 

其中我把网络请求分为网络请求类,网络请求方法类,json数据解析类,其主要代码如下:

 

<span style="white-space:pre">	</span>/**
	 * 解析天气信息工具类
	 * 
	 * @param handler
	 * @throws JSONException
	 */
	public static ArrayList<WeatherBean> parserJsonUtils(String result, Handler handler) throws JSONException {
		ArrayList<WeatherBean> list = new ArrayList<WeatherBean>();
		JSONObject object = new JSONObject(result);
		if (object.getString("success").equals("1")) {// 成功获取
			// 解析开始
			JSONArray res = object.getJSONArray("result");
			for (int i = 0; i < res.length(); i++) {
				WeatherBean bean = new WeatherBean();
				bean.setDays(res.getJSONObject(i).getString("days"));
				bean.setWeek(res.getJSONObject(i).getString("week"));
				bean.setCitynm(res.getJSONObject(i).getString("citynm"));
				bean.setTemperature(res.getJSONObject(i).getString("temperature"));
				bean.setWeather(res.getJSONObject(i).getString("weather"));
				bean.setWeather_icon(res.getJSONObject(i).getString("weather_icon"));
				bean.setWind(res.getJSONObject(i).getString("wind"));
				bean.setWinp(res.getJSONObject(i).getString("winp"));
				list.add(bean);
			}
			Message msg = handler.obtainMessage();
			msg.what = MsgConstant.SUCCESS;// 成功
			msg.obj = list;
			handler.sendMessage(msg);
		} else if (object.getString("success").equals("0")) {
			// 解析失败的原因并返回给WeatherActivity中的Handler
			Message msg = handler.obtainMessage();
			msg.what = MsgConstant.FAILED;// 失败
			msg.obj = object.getString("msg");
			handler.sendMessage(msg);
		} else {
			// 断网等情况
			Message msg = handler.obtainMessage();
			msg.what = MsgConstant.ERROR;// 错误未获取到json数据
			handler.sendMessage(msg);
		}
		return list;
	}
<span style="white-space:pre">		</span>/***
		 * 网络请求 
		 * 1.请求json数据 
		 * 2.解析到ArrayList中 
		 * 3.返回数据显示
		 */
		new Thread(new NetRequest()).start();</span>
<span style="white-space:pre">	</span>/**
	 * 网络请求类
	 * 异步请求
	 * @author WindyStory
	 *
	 */
	class NetRequest implements Runnable {
		@Override
		public void run() {
			try {
				//发起请求
				String json = NetUtils.NetUtil("http://api.k780.com:88/?app=weather.future&weaid=1&&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json");
				JsonUtils.parserJsonUtils(json, handler);
			} catch (JSONException e) {
				e.printStackTrace();
				// 断网等情况
				Message msg = handler.obtainMessage();
				msg.what = MsgConstant.ERROR;// 错误未获取到json数据
				handler.sendMessage(msg);
			}
		}

	}



 

因为在主线程上不能做耗时操作,所以这里使用ThreadHandler来实现异步请求,首先在Thread中去获取数据,获取数据分为三种有网请求成功SUCCESS状态,有网请求失败FAILED状态(如参数传入不正确),以及无网络时候的ERROR状态,根据三种状态来实现三种不同的状态对应Handler的处理方式。

其中图片的显示,我使用了Glide请求框架,详见这个博文:

http://blog.csdn.net/u011539882/article/details/51954349

注意需要网络权限。

 

 

项目下载地址:

http://download.csdn.net/detail/u011539882/9611691

 

 

 

作者:u011539882 发表于2016/8/24 16:26:04 原文链接
阅读:36 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>