1. 程式人生 > >Android實驗九之天氣預報

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: