扬州旅游app(二)

转载请注明出处,谢谢。


在上一篇文章里,我们写完了Splash页面和主页面。本程序预计有9个功能,详情请看主页面9个模块。

接下来我先来完成天气预报功能。

首先天气预报功能我在本程序之前,我也没写过。在DevStore上看了2个开源的程序,但是太复杂,本模块只需要让使用者了解当天扬州的天气就好了,所以不存在选择城市问题,界面我也做的比较粗糙。大家可以自行修改显示UI。

下面先上图。

扬州旅游app(二)_第1张图片

页面由2个TextView组成。第二个TextView显示我们想表达的内容。

下面贴出代码。




    

    

接下来就去实现天气预报的逻辑代码了。

首先从主页面跳转到天气预报界面。

intent = new Intent(HomeActivity.this,YangzhoutianqiActivity.class);
startActivity(intent);

在天气预报界面,因为查询天气可能需要较长的时间,所以我们通过子线程去完成更新天气的逻辑。

然后通过handler对象去更新界面。

获取天气的步骤如下:

首先获取扬州的城市代码101190601,然后通过http://www.weather.com.cn/data/sk/101190601.html去获取

天气预报的JSON数据,接下来去解析JSON数据。然后用TextView去显示。

下面给出代码

package org.guya.tourism;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.guya.tourism.utils.StreamTools;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

public class YangzhoutianqiActivity extends Activity {
	protected static final String TAG = "YangzhoutianqiActivity";
	protected static final int OK = 0;
	private TextView tv_show_tianqi;
	private String city;
	private String cityid;
	private String temp;
	private String WD;
	private String WS;
	private String SD;
	private String WSE;
	private String time;
	private String isRadar;
	private String Radar;
	private String njd;
	private String qy;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_tianqiyubao);

		tv_show_tianqi = (TextView) findViewById(R.id.tv_show_tianqi);

		updateTQ();

	}

	Handler handler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			super.handleMessage(msg);
			if (msg.what == OK) {
				Toast.makeText(YangzhoutianqiActivity.this, "我要显示天气啦", 1)
						.show();
				tv_show_tianqi.setText("city:	" + city + "\n" + "	cityid:	"
						+ cityid + "\n" + "	temp:	" + temp + "\n" + "	WD:	"
						+ WD + "\n" + "	WS:	" + WS + "\n" + "	SD:	" + SD + "\n"
						+ "	WSE:	" + WSE + "\n" + "	time:	" + time + "\n"
						+ "	isRadar:	" + isRadar + "\n" + "	Radar:	" + Radar
						+ "\n" + "	njd:	" + njd + "\n" + "	qy:	" + qy + "\n");
			}
		}

	};

	/**
	 * 联网更新天气
	 */
	private void updateTQ() {

		new Thread() {

			public void run() {
				Message mes = Message.obtain();
				try {
					// serverurl="http://www.weather.com.cn/data/sk/101190601.html"
					URL url = new URL(getString(R.string.serverurl));
					HttpURLConnection conn = (HttpURLConnection) url
							.openConnection();
					conn.setConnectTimeout(5000);
					conn.setRequestMethod("GET");
					int code = conn.getResponseCode();
					if (code == 200) {
						// 联网成功
						InputStream is = conn.getInputStream();
						// 把流转成String
						String result = StreamTools.readFromStream(is);
						// json解析
						// {"weatherinfo":{"city":"扬州","cityid":"101190601","temp":"7","WD":"西风","WS":"2级","SD":"30%","WSE":"2","time":"12:25","isRadar":"0","Radar":"","njd":"暂无实况","qy":"1027"}}
						JSONObject obj = new JSONObject(result);
						JSONObject obj1 = obj.optJSONObject("weatherinfo");
						city = obj1.optString("city");
						cityid = obj1.optString("cityid");
						temp = obj1.optString("temp");
						WD = obj1.optString("WD");
						WS = obj1.optString("WS");
						SD = obj1.optString("SD");
						WSE = obj1.optString("WSE");
						time = obj1.optString("time");
						isRadar = obj1.optString("isRadar");
						Radar = obj1.optString("Radar");
						njd = obj1.optString("njd");
						qy = obj1.optString("qy");

					}
				} catch (MalformedURLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (JSONException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} finally {
					mes.what = OK;
					handler.sendMessage(mes);
				}
			}
		}.start();

	}
}


因为涉及到连接网络,所以要去清单文件里去设置一下用户权限


到此,咱们的天气预报功能就完成了。






你可能感兴趣的:(android练手)