Android實驗九之天氣預報
實驗結果:
開啟應用主頁面:輸入濱州
程式碼:
WeatherAtivity.java
package com.example.weather; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; import model.Weather; import Util.HttpCallbackListener; import Util.HttpUtil; import adapter.WeatherAdapter; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.LayoutAnimationController; import android.view.animation.ScaleAnimation; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ListView; import android.widget.Toast; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; public class WeatherActivity extends Activity{ private EditText etCity; private ImageButton btnQuery; private ListView lvFutureWeather; public static final int SHOW_PESPONSE = 1; private List<Weather> data; private void parseWithJSON(String response){ data = new ArrayList<Weather>(); JsonParser parser = new JsonParser(); JsonObject obj = (JsonObject) parser.parse(response); //返回狀態碼 String resultcode = obj.get("resultcode").getAsString(); //如果狀態碼是200說明返回資料成功 if(resultcode != null && resultcode.equals("200")){ JsonObject resultObj = obj.get("result").getAsJsonObject(); JsonArray futureWeatherArray = resultObj.get("future").getAsJsonArray(); for(int i=0;i<futureWeatherArray.size();i++){ Weather weather = new Weather(); JsonObject weatherObject = futureWeatherArray.get(i).getAsJsonObject(); weather.setDayOfWeek(weatherObject.get("week").getAsString()); weather.setDate(weatherObject.get("date").getAsString()); weather.setTemperature(weatherObject.get("temperature").getAsString()); weather.setWeather(weatherObject.get("weather").getAsString()); data.add(weather); } } } @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_weather); setListeners(); initView(); } private void setListeners() { etCity = (EditText) findViewById(R.id.etCity); btnQuery = (ImageButton) findViewById(R.id.btnQuery); lvFutureWeather = (ListView) findViewById(R.id.lvFutureWeather); } private void initView() { btnQuery.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String city = etCity.getText().toString(); try{ city = URLEncoder.encode("濱州", "utf-8");//至關重要的一句 }catch(UnsupportedEncodingException e){ e.printStackTrace(); } System.out.println("cityName=" + city); System.out.println("lvFutureWeather="+lvFutureWeather); Toast.makeText(WeatherActivity.this, "success", Toast.LENGTH_LONG).show(); String weatherUrl = "http://v.juhe.cn/weather/index?format=2&cityname="+city+"&key=2e0565f85c267f344e16bd5b89c55444"; HttpUtil.sendHttpRequest(weatherUrl, new HttpCallbackListener() { @Override public void onFinish(String response) { Message message = new Message(); message.what = SHOW_PESPONSE; //將伺服器返回的結果存放到Message中 message.obj = response.toString(); handler.sendMessage(message); } @Override public void onError(Exception e) { System.out.println("訪問失敗"); } }); } }); } private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { switch(msg.what){ case SHOW_PESPONSE: String response = (String) msg.obj; //Toast.makeText(WeatherActivity.this, response, Toast.LENGTH_LONG).show(); System.out.println("response="+response); if(response != null){ parseWithJSON(response); WeatherAdapter weatherAdapter = new WeatherAdapter( WeatherActivity.this, R.layout.activity_weather_listitem,data); lvFutureWeather.setAdapter(weatherAdapter); ScaleAnimation scaleAnimation = new ScaleAnimation(0,1,0,1); scaleAnimation.setDuration(1000); LayoutAnimationController animationController = new LayoutAnimationController(scaleAnimation,0.6f); lvFutureWeather.setLayoutAnimation(animationController); } default: break; } } }; }
activity_weather.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/activity_weather_bg" > <LinearLayout android:id="@+id/linearlayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <EditText android:id="@+id/etCity" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="20dp" android:layout_weight="1" android:background="@android:drawable/edit_text" android:drawableLeft="@drawable/icons_weather_city" android:drawablePadding="5dp" android:ems="10" android:hint="@string/etCity" > <requestFocus/> </EditText> <ImageButton android:id="@+id/btnQuery" android:layout_width="50dp" android:layout_height="50dp" android:layout_marginTop="20dp" android:background="@null" android:src="@drawable/icons_weather_query"/> </LinearLayout> <ListView android:id="@+id/lvFutureWeather" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:dividerHeight="10dp" android:layoutAnimation="@anim/weather_list_layout_animation" > </ListView> </RelativeLayout>
activity_weather_listitem.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:layout_margin="10dp" android:background="@drawable/list_item_shape" > <TextView android:id="@+id/tvDayofWeek" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="星期日" /> <TextView android:id="@+id/tvDate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/tvDayofWeek" android:layout_alignBottom="@+id/tvDayofWeek" android:layout_alignParentRight="true" android:text="20160207"/> <TextView android:id="@+id/tvTemperature" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/tvDayofWeek" android:layout_below="@+id/tvDayofWeek" android:layout_marginTop="15dp" android:text="temperature"/> <TextView android:id="@+id/tvWeather" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/tvTemperature" android:layout_below="@+id/tvTemperature" android:layout_marginTop="15dp" android:text="weather"/> </RelativeLayout>
Weather.java
package model;
import android.R.string;
public class Weather {
private String dayOfWeek;
private String date;
private String temperature;
private String weather;
public Weather(){
}
public Weather(String dayOfWeek,String date,String temperature,
String weather){
super();
this.dayOfWeek = dayOfWeek;
this.date = date;
this.temperature = temperature;
this.weather = weather;
}
public String getDayOfWeek() {
return dayOfWeek;
}
public void setDayOfWeek(String dayOfWeek) {
this.dayOfWeek = dayOfWeek;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getTemperature() {
return temperature;
}
public void setTemperature(String temperature) {
this.temperature = temperature;
}
public String getWeather() {
return weather;
}
public void setWeather(String weather) {
this.weather = weather;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "Weather[dayOfWeek="+dayOfWeek+",date="+date+",temperature="
+temperature+",weather="+weather+"]";
}
}
WeatherAdapter.java
package adapter;
import java.util.List;
import com.example.weather.R;
import model.Weather;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
public class WeatherAdapter extends ArrayAdapter<Weather>{
private int resourceId;
public WeatherAdapter(Context context, int textViewResourceId, List<Weather> objects) {
super(context, textViewResourceId, objects);
resourceId = textViewResourceId;
}
public View getView(int position,View convertView,ViewGroup viewgroup){
Weather weather = getItem(position);
ViewHolder viewHolder = null;
if (convertView == null){
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(getContext()).inflate(resourceId, null);
viewHolder.tvDayOdWeek = (TextView) convertView.findViewById(R.id.tvDayofWeek);
viewHolder.tvDate = (TextView) convertView.findViewById(R.id.tvDate);
viewHolder.tvTemperature = (TextView) convertView.findViewById(R.id.tvTemperature);
viewHolder.tvWeather = (TextView) convertView.findViewById(R.id.tvWeather);
convertView.setTag(viewHolder);
}else{
viewHolder= (ViewHolder) convertView.getTag();
}
viewHolder.tvDayOdWeek.setText(weather.getDayOfWeek());
viewHolder.tvDate.setText(weather.getDate());
viewHolder.tvTemperature.setText(weather.getTemperature());
viewHolder.tvWeather.setText(weather.getWeather());
return convertView;
}
private class ViewHolder{
TextView tvDayOdWeek;
TextView tvDate;
TextView tvTemperature;
TextView tvWeather;
}
}
HttpCallbackListener.java
package Util;
public interface HttpCallbackListener {
void onFinish(String response);
void onError(Exception e);
}
HttpUtil.java
package Util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.R.string;
public class HttpUtil {
public static void sendHttpRequest(final String address,final HttpCallbackListener listener){
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection = null;
try {
URL url = new URL(address);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setReadTimeout(8000);
connection.setConnectTimeout(8000);
connection.setDoInput(true);
connection.setDoOutput(true);
InputStream in = connection.getInputStream();
BufferedReader reader =
new BufferedReader(new InputStreamReader(in));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
if(listener != null){
//回撥onfinish方法
listener.onFinish(response.toString());
}
} catch (IOException e) {
if(listener != null){
listener.onError(e);
}
}finally {
connection.disconnect();
}
}
}).start();
}
}
總結:
需要注意的兩點:1、該應用中用到了JSON,所以應向libs中匯入google的json-2.2.4.jar,才可以使用JSON解析器,對返回資料進行處理。2、該應用要從聚合網獲得天氣介面,要使用新申請的KEY。
案例3word的出現了一處錯誤,在WeatherActivity.java的onCreat方法中,應先定義各值呼叫setListener();然後再初始化UI呼叫initView();順序顛倒則會出現空指標異常錯誤!
相關推薦
Android實驗九之天氣預報
實驗結果: 開啟應用主頁面:輸入濱州 程式碼: WeatherAtivity.java package com.example.weather; import java.io.UnsupportedEncodingException; import java.net
Android 程式設計之天氣預報下來重新整理資料及城市容器配置--3
前面已經把活動和服務講了講,要注意的是服務的用法,我們在這裡是 extends IntentService implements LocationListener ,下面看下 IntentService IntentService是一個通過Context.startSer
微信小程式實戰之天氣預報
這個案例是仿UC中天氣介面做的中間也有點出入,預留了顯示當前城市名字和重新整理圖示的位置,自己可以寫下,也可以新增搜尋城市。值得注意的是100%這個設定好像已經不好使了,可以通過獲取裝置的高度通過資料繫結設定高度。地址:https://github.co
3 機器學習入門——決策樹之天氣預報、鳶尾花
前面我們簡單學習了線性迴歸、邏輯迴歸,不知道有沒有做一個總結,那就是什麼時候該用邏輯迴歸?從結果來觀察,可以看到,線性迴歸的過程就是在找那個合適的方程,來儘量滿足你的每行資料。即Y=ax + bx^2 + …….通過演算法來尋找合適的a、b、c。一般來說,線性迴歸適用於最終結
Android 端天氣預報APP的實現(一)天氣顯示介面之上下滑動
最近參加了一個小比賽,選了天氣預報APP這個題目,最初選擇它,是想練練網路資料獲取和資料解析方面的知識,後來發現倒是學到了不少介面的東西。下面我來一步步講解一下我是怎麼完成的吧~ 首先,天氣預報最直觀的部分應該就是天氣顯示介面了,這裡,我想做成可以有上下滑動的
Android程式之全國天氣預報查詢(聚合資料開發)
一、專案演示效果如下: (2)註冊賬號—建立一個新應用(在個人中心頁面—資料中心—申請資料)–填入自己的應用–找到分類–天氣預報—全國天氣預報 (3)下載sdk (由於專案使用的是1點幾的版本,所以請下載:包含在我的專案中!) (4)參
2017.08.04 Python網絡爬蟲之Scrapy爬蟲實戰二 天氣預報
font size 項目 執行 weather html time art show 1.項目準備:網站地址:http://quanzhou.tianqi.com/ 2.創建編輯Scrapy爬蟲: scrapy startproject weather scrapy
2017.08.04 Python網絡爬蟲之Scrapy爬蟲實戰二 天氣預報的數據存儲問題
sql語句 city amd64 ces img href asp encoding primary 1.數據存儲到JSon:程序閱讀一般都是使用更方便的Json或者cvs等待格式,繼續講解Scrapy爬蟲的保存方式,也就是繼續對pipelines.py文件動手腳 (1)創
Android天氣預報設計
image 適配 com 功能 數據 receiver wid ima style ——嵌入式軟件開發 名字功能模塊代碼行數備註謝燦輝Widget200桌面小程序李楊敏GPS定位,百度地圖API100-150獲取當前所在城市丁小芳城市選擇Activity,天氣
Python之釘釘機器人推送天氣預報
images ges cto token ken 提取 爬取 ces ont 通過Python腳本結合釘釘機器人,定時向釘釘群推送天氣預報 #!/usr/bin/python # -*- coding: utf-8 -*- # Author: [email protected]
Android高手進階教程(九)之----Android Handler的使用!!!
() timer welcom csdn 發送 state img 技術分享 技術 大家好我們這一節講的是Android Handler的使用,在講Handler之前,我們先提個小問題,就是如何讓程序5秒鐘更新一下Title.首先我們看一下習慣了Java編程的人,在不知道H
Android經典項目開發之天氣APP實例分享
material 預報 master key 功能 github web 獨立 提升 原文:Android經典項目開發之天氣APP實例分享 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.ne
天氣查詢之高德地圖天氣預報介面
一、html程式碼 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="initial-scale=1
基於android的天氣預報的設計與實現
目錄 應用開發技術及開發平臺介紹 應用需求分析 應用功能設計及其描述 應用UI展示 ①開發技術: 本系統是採用面向物件的軟體開發方法,基於Android studio開發平臺,以Android作為本系統的開發語言實現音樂播放器預定的需求功能。 ②平臺介紹 硬體平臺
Python C/S 網路程式設計(一)之 三種方法實現天氣預報小程式
1. 首先明白下協議棧和庫的概念: 協議棧(Protocol Stack): 是指網路中各層協議的總和,其形象的反映了一個網路中檔案傳輸的過程:由上層協議到底層協議,再由底層協議到上層協議。 庫(Library):主要用來解析要使用的網路通訊協議,包含Python內建標準庫
組合語言之實驗九
1. 補全程式t1.asm,完成在螢幕上輸出記憶體單元中的十進位制兩位數 ; 在螢幕上輸出記憶體單元中的十進位制兩位數 assume cs:code, ds:data data segment db 12 db 0h,0h ; 前一個位元組用於儲存商,後一個位元組用於儲
Android實戰技巧之四十九:Usb通訊之USB Host
零 USB背景知識 USB是一種資料通訊方式,也是一種資料匯流排,而且是最複雜的匯流排之一。 硬體上,它是用插頭連線。一邊是公頭(plug),一邊是母頭(receptacle)。例如,PC上的插座就是母頭,USB裝置使用公頭與PC連線。 目前USB硬體介面
Android天氣預報的製作
相信很多人在剛接觸Android時都會做一個天氣預報來了解Android,今天得空整理了一個簡單天氣預報Demo的製作,如下: 首先我們應該做的便是搞到一個天氣預報的API,在這裡我推薦註冊和風天氣個人開發者,認證時間1-3天,基本一下子就可以收到了認證成功的郵件。認證開發者後可以獲得中國和海外
Android 天氣預報(使用okHttp、AsyncTask訪問和風天氣並Gosn解析資料)
第一步老規矩導架包,都是開源哦 在專案的配置檔案中新增 compile 'com.squareup.okhttp3:okhttp:3.2.0' compile 'com.squareup.okio:okio:1.9.0' compile 'com.google.code.gs
Android實戰技巧之九:最新Android開發環境(Eclipse+ADT+Android 5.0)
一、一切由執行時錯誤引起dalvikvm Could not find class '引用包.類', referenced from method... 其實在編譯時也會見到如下錯誤: [dx] [dx] trouble processing: