编写Android天气预报小程序的总结

        研究《精通Android 3》书有一个月,对于所看过的知识点不是掌握的很好,所以想找个项目来练手,想到就去做,在eoeAndroid的开发社区找到了Android天气预报小程序,就把它下载了下来。首先,将项目的源代码导入到Eclipse里面,我使用的模拟器的版本是Android 2.3.3的,点击运行出现在我们眼前的是一个欢迎界面,心情有点激动,呵呵!如图所示:

欢迎界面

        接着就进入到主界面,如图所示:

主界面

        体验了一番之后,从感观上知道程序是采用什么方式布局的,猜测程序的各个控件具备些什么功能,并且是通过什么方法去实现它的。接着开始分析程序的源代码,在分析源代码的过程中,有不懂的我就google或者bing,基本的思路有了,就开始动手做这个天气预报的小程序。

        首先,将“欢迎界面”的Activity截图下来,使用“画图”工具打开,在右侧写出“欢迎界面”Activity的实现步骤,接着,将“主界面”的Activity也截图下来,使用“画图”工具打开,与“欢迎界面”的Activity一样,将实现的步骤写出来,最后,将Eclipse项目中的每个包中的类都展开(如图所示),截图后用“画图”工具打开,将每个类需要做的哪些事情用文字描述出来,关于以上提到的三个截图,要做到分析的越详细越好,这样有便于开发。

 

 

包的命名以及类的命名

        在开始写这个程序之前,要确保准备工作是否做好了,如果觉得哪一块还是不太懂的话,还是再把源代码拿出来研究一番,直到搞懂为止。扯远点,这样有利于在这个程序的基础上附加些自己想要的功能。

        现在,可以动手写Android天气预报小程序了,以下是我对编写这个程序的理解,表述的不是很好,望指出,呵呵!

        LoadUI.java需要做的事情有:

        1.加载进度条,代码如下:

GIFView gif = new GIFView(LoadUI.this, R.drawable.progress);
((RelativeLayout) findViewById(R.id.progress)).addView(gif);

        GIFView类,该类中的调用了GIFDecode类中的方法,对于GIFDecode类的理解不是很透彻,我是使用另外一种方法解决“欢迎界面”Activity的进度条加载方法,没有使用到GIFDecode类,但是,加载进度条的效果非常的逊色。以下代码是放在GIFView类中的。

public class GIFView extends View
{
	private Movie mMovie;
	private long mMovieStart;
	
	public GIFView(Context context, int img)
	{
		super(context);
		// 以文件流的方式读取文件
		mMovie = Movie.decodeStream(getResources().openRawResource(img));
	}
	
	@Override
	protected void onDraw(Canvas canvas)
	{
		long curTime = SystemClock.uptimeMillis();
		// 第一次播放
		if (mMovieStart == 0)
		{
			mMovieStart = curTime;
		}
		
		if (mMovie != null)
		{
			int duration = mMovie.duration();
			
			int relTime = (int) ((curTime - mMovieStart) % duration);
			mMovie.setTime(relTime);
			mMovie.draw(canvas, 0, 0);
			
			// 强制重绘
			invalidate();
		}
		super.onDraw(canvas);
	}
}

        2.使用Intent加载天气预报数据的服务,代码如下:

intent = new Intent(LoadUI.this, LoadDataService.class);
Bundle bundle = new Bundle();	// 创建天气内容
bundle.putString("city", WeatherUtil.getDefaultCity(LoadUI.this));
bundle.putBoolean("check", false);	// 不编写内容
intent.putExtras(bundle);	// 封装天气
LoadUI.this.startService(LoadUI.this.intent);

        LoadDataService类是用于加载天气预报数据的服务类,这个类需要做以下几件事情:

        2.1.将当前城市的解码为UTF-8,代码如下:

city = URLEncoder.encode(city, "UTF-8");

        例如:输入“南昌”,它会将“南昌”解码成%E5%8D%97%E6%98%8C,为什么需要将城市解码为UTF-8,可以用浏览器测试,当在我浏览器中输入http://www.google.com/ig/api?hl=zh-cn&weather=%E5%8D%97%E6%98%8C时,它会显示南昌的天气,当我在浏览器中输入http://www.google.com/ig/api?hl=zh-cn&weather=南昌,出现<problem_cause data=""/>错误。除了利用解码的方式,还有一种方法,输入城市的拼音,像http://www.google.com/ig/api?hl=zh-cn&weather=Nanchang

        2.2.通过将城市解码成UTF-8编码后,就可以开始解析http://www.google.com/ig/api?hl=zh-cn&weather=“解码后的城市名”网站的xml,解析工作交给XmlParse类,这个类需要去扩展DefaultHandler,并且需要重写startElement()和endElement()两个方法。

        2.3.通过google上的天气图标名称如:<icon data="/ig/images/weather/chance_of_rain.gif"/>来与本地图片的Map中的键是否包含,如果包含,通过该键,得到本地图片的资源,本地图片的资源就是值。实现如下,以下代码还判断了白天与晚上显示的天气图片是不一样的:

public static int getImageName(String imageUrl, boolean isNight)
{
	String[] str = imageUrl.split("/");
	// str[str.length - 1]:表示的是 google icon的名称
	if (isNight)
	{
		if (Constant.NIGHT_IMAGE_MAP.containsKey(str[str.length - 1]))
		{
			return Constant.NIGHT_IMAGE_MAP.get(str[str.length - 1]);
		}
		else
		{
			return Constant.DEFAULT_IMG;
		}
	}
	else
	{
		if (Constant.DAY_IMAGE_MAP.containsKey(str[str.length - 1]))
		{
			return Constant.DAY_IMAGE_MAP.get(str[str.length - 1]);
		}
		else
		{
			return Constant.DEFAULT_IMG;
		}
	}
}

        对于LoadDataService类的讲解到此为止,现在还是继续讲解LoadUI.java需要做的事情。

        3.启动“主界面”Activity。

        最后,感谢写Android天气预报小程序的人,给了我怎样去编写天气预报程序的思路。在此,说声“谢谢”了。讲解的很凌乱,不好意思啊,各位!

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值