通过查找资料及自己开发完成

<span style="color:#33ff33;">前期分析:需要三个类完成:一个主类、一个请求类、一个数据处理类
<span style="white-space:pre">			</span>MainActivity、HttpRequestTools、AnalyseTools</span>
<span style="color:#33ff33;"><span style="white-space:pre">		</span>小伙伴们需要自己获取百度的天气API的请求接口及apikey;</span>
<span style="color:#33ff33;"><span style="white-space:pre">		</span>应用到的Android知识:(简单到复杂):界面的布局--JSON数据的解析--数据的传递--网络通信--线程的使用</span>
1.主类
<pre name="code" class="java">package com.example.baidutq;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.app.Activity;


public class MainActivity extends Activity {
	
	
	//声明apikey
	private static final String apiKey="小伙伴自己获取";
	
	//上传请求的地址信息
	private String httpUrl = "http://apis.baidu.com/apistore/weatherservice/cityname";
	
	//用户输入的城市信息
	  private String httpArg = null;  
	    private Handler handler=null;  
	    private EditText cityET;  
	    private TextView showInfo;  
	    private ImageView imageView;  
	    private String cityName=null; 
	    private Button btn;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		intiView();
		 
		 btn.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
		
				try {
					//注意在api文档中他没有提及直接用汉字传输信息是不行的,这里需要将用户输入的城市信息进行网络编码  
	                //例如北京编码完成后就变成了%E5%8C%97%E4%BA%AC 
					cityName = URLEncoder.encode(cityET.getText().toString(),"UTF-8");//转码
					
				} catch (UnsupportedEncodingException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				httpArg = "cityname="+cityName;
				/*--------------------------------------重点--------------------------------------------*/
				//发送获取天气请求
				HttpRequestTools httpRequestTools = new HttpRequestTools(
						httpUrl, httpArg, apiKey, showInfo, imageView, handler);
				httpRequestTools.start();
				/*--------------------------------------重点--------------------------------------------*/
			}
		});
		
	}

	private void intiView() {
		 cityET=(EditText) findViewById(R.id.ctyi_name);
		 btn=(Button) findViewById(R.id.btn_chak);
		 imageView=(ImageView) findViewById(R.id.show_Image);
		 showInfo=(TextView) findViewById(R.id.text_show);
		 
		 handler = new Handler(){
			@Override
			public void handleMessage(Message msg) {
				super.handleMessage(msg);
			} 
		 };
		 
	}	

}


 
2.请求类
<pre name="code" class="java">package com.example.baidutq;

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 org.apache.http.HttpClientConnection;

import android.os.Handler;
import android.widget.ImageView;
import android.widget.TextView;

//这个类用来提交请求并接收服务器给我们返回的天气数据

//因为需要访问网络,会耗时所以需要创建新的线程,所以继承Thread
public class HttpRequestTools  extends Thread{

	//需要的相关参数:
	String httpUrl,httpArg,apikey;
	
	public TextView show;//显示数据
	ImageView imageView;//显示天气图片
	
	//通信的Handle
	Handler handler;
	
	//创建构造函数
	public HttpRequestTools(String httpUrl, String httpArg, String apikey,
			TextView show, ImageView imageView, Handler handler) {
		super();
		this.httpUrl = httpUrl;
		this.httpArg = httpArg;
		this.apikey = apikey;
		this.show = show;
		this.imageView = imageView;
		this.handler = handler;
	}
	
	@Override
	public void run() {
		super.run();
		//缓存得到的数据
		StringBuffer buffer = new StringBuffer();
		BufferedReader reader=null;
		String result=null;
		
		//创建api的url组合
		httpUrl=httpUrl+"?"+httpArg;
		
		try {
			/*-----------------------------------重点------------------------------------------------*/
			//创建请求的url
			URL url = new URL(httpUrl);
			//发送获取天气的请求
			 HttpURLConnection connection = (HttpURLConnection) url.openConnection();//打开请求--链接请求
			 connection.setRequestMethod("GET");//请求方式
			 connection.setRequestProperty("apikey", apikey);//请求key
			 connection.connect();//提交请求
			 
			 //接受传回的数据---保存到数据流中
			 InputStream in = connection.getInputStream();
			 reader= new BufferedReader(new InputStreamReader(in, "UTF-8"));
			 String str;
			 
			 while ((str=reader.readLine())!=null) {
				buffer.append(str+"\n");
			}
			 //数据接受完,关闭流操作
			 reader.close();
			 in.close();
			 
			 
			 result=buffer.toString();
			 
			 //对得到数据进行Json解析
			 AnalyseTools analyseTools = new AnalyseTools(result);
			
			 //解析后的数据AnalyseText
			 final String finalResult = analyseTools.AnalyseText();
			 
			 //更新数据
			 handler.post(new Runnable() {
				
				@Override
				public void run() {
					show.setText(finalResult);//显示返回的数据
					if (finalResult.contains("多云")) {
						imageView.setImageResource(R.drawable.duoyun);
					}else if (finalResult.contains("晴")) {
						imageView.setImageResource(R.drawable.qing);
					}else if (finalResult.contains("雨")) {
						imageView.setImageResource(R.drawable.yu);
					}else if (finalResult.contains("阴")) {
						imageView.setImageResource(R.drawable.yin);
					}else if (finalResult.contains("雪")) {
						imageView.setImageResource(R.drawable.xue);
					}
					
				}
			});
			
			
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}


}


 
3.数据处理类
package com.example.baidutq;

import org.json.JSONException;
import org.json.JSONObject;

//对数据进行处理
public class AnalyseTools {  
    String receiveInfo=null;  
    
    //构造方法传入解析的JSON数据
    AnalyseTools(String JsonText)  
    {  
        receiveInfo=JsonText;  
    }  
    
    //解析接受的文本信息
    public String AnalyseText(){  
  
        String weatherInfo=null;  //天气的信息
        //先判断一下天气是否获取成功,如果没成功会有errNum:-1提示  
        if(receiveInfo.contains("\"errNum\":-1"))  //失败的标志
        {  
            weatherInfo="请求天气数据失败,请稍后再试";  
        }  
        else {  
            try {  
                //使用Json来解析文本数据  
                JSONObject jsonObject = new JSONObject(receiveInfo);  
                //定位到retData关键词  
                JSONObject json = (JSONObject) jsonObject.get("retData");  
                StringBuffer sb = new StringBuffer();  
                sb.append("城市: " + json.getString("city") + "\n");  
                sb.append("日期: " + json.getString("date") + "\n");  
                sb.append("发布时间: " + json.getString("time") + "\n");  
                sb.append("天气情况: " + json.getString("weather") + "\n");  
                sb.append("温度: " + json.getString("temp") + "\n");  
                sb.append("最低气温: " + json.getString("l_tmp") + "\n");  
                sb.append("最高气温: " + json.getString("h_tmp") + "\n");  
                sb.append("风向: " + json.getString("WD") + "\n");  
                sb.append("风力: " + json.getString("WS") + "\n");  
                sb.append("日出时间: " + json.getString("sunrise") + "\n");  
                sb.append("日落时间: " + json.getString("sunset") + "\n");  
                weatherInfo = sb.toString();  
  
            } catch (JSONException e) {  
                e.printStackTrace();  
            }  
        }  
        return weatherInfo;  
    }  
  
}  

4.相关的布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <ImageView
        android:id="@+id/show_Image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:src="@drawable/mm"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <EditText
            android:id="@+id/ctyi_name"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="例如:"上海" />

        <Button
            android:id="@+id/btn_chak"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/btn_chak" />
    </LinearLayout>

    <TextView
        android:id="@+id/text_show"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

5.截图:



如果想要跟丰富的界面效果,就要小伙伴们自己设计实现了。生气




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值