利用json获取天气信息


       天气预报信息获取是利用json获取的,网上有非常多资源,源码。因为上面涉及到非常多天气信息,包含湿度,出行建议等,以及加入了全部城市代码的资源包。为了练手了解json的原理。我仅获取诚笃城市的最高温,最低温,城市名字。

     我的布局是通过一个button获取城市名字,最高温,最低温。main.xnl代码例如以下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="城市名称:" />

    <EditText
        android:id="@+id/tx_cityname"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" >
    </EditText>

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="最高温度:" />

    <EditText
        android:id="@+id/tx_height"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="最低温度:" />

    <EditText
        android:id="@+id/tx_low"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" />
	 <Button
        android:id="@+id/button_refresh"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="获取实时天气信息" >
    </Button>
</LinearLayout>

     本project含有2个java文件各自是WheatherLck.java和WheatherInfo.java文件。WheatherLck.java代码例如以下

package com.hiden.weatherdemo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;







import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

public class WeatherLck extends Activity {

	// 创建三个全局的文本框对象
		EditText TX_CITYNAME,TX_HEIGHT,TX_LOW;
		private String city_str="成都";
		Button button_refresh;
		
		@Override
		protected void onCreate(Bundle savedInstanceState) {
			// TODO Auto-generated method stub
			super.onCreate(savedInstanceState);
			setContentView(R.layout.main);
			
			// 获取布局中的文本框
			TX_CITYNAME=(EditText)this.findViewById(R.id.tx_cityname);
			TX_CITYNAME.setText(city_str);
			TX_HEIGHT=(EditText)this.findViewById(R.id.tx_height);
			TX_LOW=(EditText)this.findViewById(R.id.tx_low);
			
			button_refresh=(Button)findViewById(R.id.button_refresh);
			
			button_refresh.setOnClickListener(new View.OnClickListener() {
				
				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					if(v==button_refresh){
						refresh(city_str);
					}
					
				}
			});
		

		/**************************************************************************************
		 * 获取http://m.weather.com.cn/data/101091106.html上面的数据
		 * 当中101091106为城市代码,上面我已经把城市代码做了改动,去除了空行,格式为UTF-8
		 * 每次仅仅是执行一次线程,然后增加主线程回收
		 * @param city_str
		 * @throws JSONException 
		 * @throws Exception 
		 * @throws ClientProtocolException 
		 */
		private Thread thread;
		private Handler handler = new  Handler(){
			@Override
			public void handleMessage(Message msg){
				switch(msg.what){
				case 1:
					JSONObject weather = (JSONObject) msg.obj;
					refreshUI(weather);
					try {
						thread.join();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					break;
				}
			}
		};
		/************************************************************************
		 * 在主线程中不能请求网络
		 * 线程没有while循环仅仅是执行一次,假设有溢出可能不能发送消息
		 * @param city_str
		 */
		private void requestWeather(final String city_str){
			
			thread = new Thread(new Runnable(){
				@Override
				public void run() {
					// TODO Auto-generated method stub

				
					String url="http://www.weather.com.cn/data/cityinfo/101270101.html";
					HttpClient client = new DefaultHttpClient();
					HttpGet httpget = new HttpGet(url);
					HttpResponse response;
					String sbuf = null;
					try {
						response = client.execute(httpget);
						HttpEntity httpentity = response.getEntity();	
						if(httpentity != null){
							BufferedReader br = new BufferedReader(new InputStreamReader(httpentity.getContent(),"utf-8"));	
							sbuf = br.readLine();	
						}	
						JSONObject object = new JSONObject(sbuf);
						JSONObject data = (JSONObject) object.getJSONObject("weatherinfo");
						//Log.i(TAG, data.toString());
						Message msg = new Message();
						msg.what = 1;
						msg.obj = data;
						handler.sendMessage(msg);
						
					} catch (ClientProtocolException 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();
					}
				}	
			});
			thread.start();
			
		}
		protected void refresh(String city_str)
		{
			requestWeather(city_str);
		}
		private void refreshUI(JSONObject jsonobject){
			
			JSONObject jsonData = jsonobject;
			try
			{
				
				TX_CITYNAME.setText(jsonData.getString("city"));
				// 取得高温数据
				TX_HEIGHT.setText(jsonData.getString("temp1"));
				// 取得低温数据
				TX_LOW.setText(jsonData.getString("temp2"));

			
			}catch(Exception e){
				e.printStackTrace();
			}

		}

	}



     WheatherInfo.java代码例如以下:

package com.hiden.weatherdemo.ui;

public class WeatherInfo {
	String city = "";
	String temp1 = "";
	String temp2 = "";// 椋庡悜


	public String getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	@Override
	public String toString() {
		return "WeatherInfo [city=" + city + ", temp1=" + temp1
				+ ", temp2=" + temp2 + "]";
	}

	

	public String getTemp1() {
		return temp1;
	}

	public void setTemp1(String temp) {
		this.temp1 = temp;
	}
	
	public String getTemp2() {
		return temp2;
	}

	public void setTemp2(String temp) {
		this.temp2 = temp;
	}


}
点击button,获得到成都的最高温度和最低温度,效果图例如以下:

当然,大家能够依据自己的需求做出更具体的效果图,比方加入未来5天的天气,定位,加入关注城市等功能。网上资源比較多,大家能够多练习练习。



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用网络API调用天气数据,并解析JSON格式的返回数据来获取天气信息。在Android Studio中,可以利用第三方库如OkHttp、Gson等来处理这些操作。还可以使用Android自带的Volley库进行网络请求和JSON解析。 ### 回答2: 在 Android Studio 中获取 JSON 天气数据是一个相对简单的任务。首先,我们需要了解如何获取 JSON 数据并将其解析为可用的 Java 对象,并使用这些对象来更新我们的用户界面。 JSON 数据的来源可以是网络或本地文件。我们可以使用 Java 的 URL 类和 HttpURLConnection 类来连接到 API 并获取 JSON 响应。如果我们有本地的 JSON 文件,则可以使用 Java 的 FileInputStream 类和 InputStreamReader 类来读取文件并将其解析为 JSON 对象。 对于 JSON 解析,Android Studio 提供了一个方便的库,称为 Gson 库。我们可以使用这个库来将 JSON 数据解析为可用的 Java 对象。要使用 Gson 库,请将以下代码添加到 build.gradle 文件中: ``` dependencies { implementation 'com.google.code.gson:gson:2.8.6' } ``` 然后,在我们的 Java 类中,我们可以使用以下代码来解析 JSON 数据并将其存储在对象中: ```java // Sample JSON response String jsonResponse = "{\"weather\": \"sunny\", \"temperature\": \"75\"}"; // Use Gson library to convert JSON to Java object Gson gson = new Gson(); WeatherWeatherData data = gson.fromJson(jsonResponse, WeatherWeatherData.class); // Access fields of Java object String weather = data.getWeather(); String temperature = data.getTemperature(); ``` 在这个示例中,我们定义了一个包含天气和温度的 JSON 字符串。接下来,我们使用 Gson 库将其解析为一个 WeatherData 对象。最后,我们可以通过调用对象的 getter 方法来访问 Java 对象的字段。 为了使这个示例更加有用,我们可以结合使用 HttpURLConnection 从 OpenWeatherMap API 获取实时天气数据。我们需要使用我们的 OpenWeatherMap API 密钥来发出 HTTP 请求并获得 JSON 响应。命令如下: ```java URL url = new URL("http://api.openweathermap.org/data/2.5/weather?q=London&appid=API_KEY"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); try { InputStream inputStream = urlConnection.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line; StringBuilder stringBuilder = new StringBuilder(); while ((line = bufferedReader.readLine()) != null) { stringBuilder.append(line).append("\n"); } bufferedReader.close(); String jsonResponse = stringBuilder.toString(); // Use Gson to parse JSON response // ... } finally { urlConnection.disconnect(); } ``` 在这个示例中,我们使用我们的 API 密钥向 OpenWeatherMap API 发出 HTTP 请求。然后,我们获取响应输入流并使用 BufferedReader 类将其转换为一个字符串。最后,我们可以使用 Gson 库将 JSON 解析为可用的 Java 对象。 总之,这是获取 JSON 天气数据的一般步骤。我们需要首先连接 API 或读取 JSON 数据文件。然后,我们将 JSON 数据解析为可用的 Java 对象。最后,我们可以使用这些对象更新用户界面或执行其他操作。 ### 回答3: 在Android Studio中获取JSON天气数据,需要完成以下步骤: 1. 在Android Studio中创建一个新的工程。 2. 在gradle文件中添加网络请求库retrofit和gson解析库的依赖。 3. 在AndroidManifest.xml中添加网络访问权限。 4. 创建一个Weather类,用于存储天气信息,包括城市名、温度、天气情况等。 5. 创建一个Api接口,定义获取天气信息的请求方法、请求参数以及请求地址。 6. 创建一个Retrofit实例,使用create()方法创建Api接口代理对象。 7. 在主活动中,获取City的名称和地址,构建HttpGet请求地址,并使用retrofit代理对象发起网络请求。 8. 在回调函数中,解析获取到的JSON数据,并将天气信息填充到ListView中展示。 需要注意的是,由于涉及网络请求和数据解析,需要在子线程中完成。同时,还需要考虑网络异常的情况和解析JSON数据时的异常情况,并对错误进行处理。此外,在实际应用中,还需要通过API Key进行身份验证,确保访问安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值