Weather report
来源:互联网 发布:qpst找不到手机端口 编辑:程序博客网 时间:2024/05/29 03:56
对于大多数的Android手机,天气app都是系统必备的,对于天气预报的功能的实现,最近也做了研究,其实也不是太复杂,主要用到了网络请求以及数据解析方面的内容。下面就来详细介绍下如何在android中实现天气appj基本功能的开发。
1.网络请求,在android系统中,网络请求主要有两种实现方式,URLConnection和httpClient,这两种方式都可以实现网络请求。
(1)URLConnection
(2)HttpClient
2.JSON解析
JSON类型数据是很常见的数据类型,它比起XML来方便很多,它是以键值对的形式来存储数据的,所以很常用。解析起来非常容易,实例化一个JSONObject类,读取到网页上的内容,也就是上边的list传进去,即JSONObject json = new JSONObject(list),然后直接调用getString()把你需要的信息的键传进去,就能得到对应的值了,很容易。这就是我们实现天气预报的基本过程。下面是博主的一个小小的例子。
1.网络请求,在android系统中,网络请求主要有两种实现方式,URLConnection和httpClient,这两种方式都可以实现网络请求。
(1)URLConnection
URL url = new URL(path); URLConnection conn = url.openConnection(); conn.connect(); InputStream in = conn.getInputStream(); BufferedReader buffer = new BufferedReader(new InputStreamReader(in)); String list = buffer.readLine(); while (list != null) { xml += list; list = buffer.readLine(); }这里的path就是我们要访问的网址,这样我们就可以将网页上的内容按照字符形式读取下来。存到list这个字符串中。(别忘了还要在注册文件中添加访问网络权限)
(2)HttpClient
HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(path); HttpResponse response = client.execute(get); int code = response.getStatusLine().getStatusCode(); if (code == 200) { InputStream reader = response.getEntity().getContent(); BufferedReader buffer = new BufferedReader(new InputStreamReader(reader)); String list = buffer.readLine(); while (list != null) { xml += list; list = buffer.readLine(); } }这里的path同样是网络地址,code是服务器给我们返回的一个值,如果是200,就说明访问成功,404就表示客户端异常,505就表示服务器端异常。不过用这种方式请求的话需要导入两个包httpclient和httpcore,这两个包都在studio文件夹的bin目录下,复制到你项目的libs目录下,还要进行导入,File-project structure-app-dependencies-'+'-File dependency,按照顺序然后选中你要导入的包,确认,就可以了。在导入这两个包后可能还要在build-grade目录下加入以下内容
packagingOptions { exclude 'META-INF/DEPENDENCIES.txt' exclude 'META-INF/LICENSE.txt' exclude 'META-INF/NOTICE.txt'exclude 'META-INF/NOTICE'exclude 'META-INF/LICENSE'exclude 'META-INF/DEPENDENCIES'exclude 'META-INF/notice.txt'exclude 'META-INF/license.txt'exclude 'META-INF/dependencies.txt'exclude 'META-INF/LGPL2.1'}这样我们就可以访问网络上的资源了。对于免费的天气api,网上有很多,我用的是这个:http://www.k780.com/api/weather.future,很好用,提供的数据也很全面,实时天气,未来5-7天的,PM2.5和空气指数都有提供,我们只需要对需要的数据进行访问然后获取,接下来就是取出我们所需要的数据了,也就是JSON解析。
2.JSON解析
JSON类型数据是很常见的数据类型,它比起XML来方便很多,它是以键值对的形式来存储数据的,所以很常用。解析起来非常容易,实例化一个JSONObject类,读取到网页上的内容,也就是上边的list传进去,即JSONObject json = new JSONObject(list),然后直接调用getString()把你需要的信息的键传进去,就能得到对应的值了,很容易。这就是我们实现天气预报的基本过程。下面是博主的一个小小的例子。
public class MainActivity extends Activity { private TextView temperature; private TextView weather; private TextView aqi; private TextView humidity; private TextView degree; private TextView location; private Button add; private Message msg; public static Handler handler; public static String position = ""; public static boolean start = false; LocationClient locationClient = null; BDLocationListener myListener = new MyLocationListener(); SwipeRefreshLayout swipeRefreshLayout; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); add = (Button) findViewById(R.id.buttonId); temperature = (TextView) findViewById(R.id.tempId); weather = (TextView) findViewById(R.id.weatherId); aqi = (TextView) findViewById(R.id.aqiId); humidity = (TextView) findViewById(R.id.humidityId); degree = (TextView) findViewById(R.id.degreeId); location = (TextView) findViewById(R.id.city); add.setOnClickListener(new ButtonListener()); handler = new Myhandler(); swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefresh); swipeRefreshLayout.setColorSchemeColors(android.R.color.background_light); swipeRefreshLayout.setSize(10); swipeRefreshLayout.setProgressBackgroundColor(android.R.color.white); swipeRefreshLayout.setOnRefreshListener(new reFreshListener()); getLocationThread g = new getLocationThread(); thread t = new thread(); Thread T = new Thread(t, "Refresh"); T.start(); } public static String getURLConnection(String path) { String xml = ""; try { HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(path); HttpResponse response = client.execute(get); int code = response.getStatusLine().getStatusCode(); if (code == 200) { InputStream reader = response.getEntity().getContent(); BufferedReader buffer = new BufferedReader(new InputStreamReader(reader)); String list = buffer.readLine(); while (list != null) { xml += list; list = buffer.readLine(); } } } catch (Exception e) { e.printStackTrace(); } return xml; } public class reFreshListener implements SwipeRefreshLayout.OnRefreshListener {<span> @Override public void onRefresh() { thread t = new thread(); Thread T = new Thread(t, "Refresh"); T.start();<span style="white-space:pre"> } } private class thread implements Runnable { @Override public void run() { String todayXML = "http://api.k780.com:88/?app=weather.today&weaid="; String aqiXMl = "http://api.k780.com:88/?app=weather.pm25&weaid="; String futureXML = "http://api.k780.com:88/?app=weather.future&weaid="; String suffixXML = "&&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json"; String todayWeather = getURLConnection(todayXML + position + suffixXML); String todayAqi = getURLConnection(aqiXMl + position + suffixXML); Message msg = new Message(); Bundle bundle = new Bundle(); bundle.putString("todayWeather", todayWeather); bundle.putString("todayAqi", todayAqi); msg.setData(bundle); try { Thread.sleep(1000); handler.sendMessage(msg); } catch (InterruptedException e) { e.printStackTrace(); } } } public class Myhandler extends Handler { public void handleMessage(Message msg) { swipeRefreshLayout.setRefreshing(false); String todayWeather = msg.getData().getString("todayWeather"); if (todayWeather != null) { try { todayWeather = String.valueOf(new JSONObject(todayWeather).getJSONObject("result")); JSONObject json = new JSONObject(todayWeather); location.setText(json.getString("citynm")); String temp = json.getString("temp_curr"); final float scale = getApplicationContext().getResources().getDisplayMetrics().density; if (temp.length() == 2) { temperature.setWidth((int) (84 * scale + 0.5f)); System.out.println((int) (84 * scale + 0.5f)); } else if (temp.length() == 3) { temperature.setWidth((int) (140 * scale + 0.5f)); } temperature.setText(temp); degree.setText("o"); weather.setText(json.getString("weather")); humidity.setText("湿度" + json.getString("humidity") + " " + json.getString("wind") + json.getString("winp")); } catch (Exception e) { e.printStackTrace(); } } String todayAqi = msg.getData().getString("todayAqi"); if (todayAqi != null) { try { todayAqi = String.valueOf(new JSONObject(todayAqi).getJSONObject("result")); JSONObject json = new JSONObject(todayAqi); aqi.setText("空气指数" + json.getString("aqi") + " " + json.getString("aqi_levnm") + " " + json.getString("aqi_remark")); } catch (JSONException e) { e.printStackTrace(); } } } }上面就是实现获取实时天气的主要内容,其实很容易,但是要想实现更全面的功能就比较复杂了,本来我还想做一下定位功能,结果由于阅码能力太渣,读不懂大神们的代码,所以暂时没有实现这个功能,后续会跟进。不过关于定位大家可以用百度地图API,http://developer.baidu.com/map/index.php?title=android-locsdk上面有详细介绍,也可以下载它的Demo来仔细研读。
0 0
- Weather Report
- Weather report
- weather
- weather
- Weather
- report
- Report
- report
- Report
- report
- Report ><
- Report
- Report
- weather glossary
- googole weather
- weather jp
- Weather Forecast
- xml weather
- 嵌入式实验(一)
- 表单提交ajax实现
- 总结
- [Mac入门]如何在Mac下显示Finder中的所有文件
- ubuntu下插上网线但是无法使用有线网络的解决办法
- Weather report
- USACO kimbits
- C# — WinForm DataGridView篇
- 棋盘格的角点标定与相机参数标定
- Matlab"out of memory"问题
- VMware12 安装 OS X 10.10 详细教程
- ubuntu 中 邮箱消息通知
- 还是性能优化专题
- Ants