Android实战制作简易天气预报软件

来源:互联网 发布:windows远程桌面工具 编辑:程序博客网 时间:2024/04/27 17:30

前言:  真正的梦想,永远在实现之中,更在坚持之中。累了,就停一停,让手贴着手,温暖冷漠的岁月;苦了,就笑一笑,让心贴着心,体味至爱的抚摸;哭了,就让泪水尽情流淌,痛彻心菲也是精彩。选择一条道路,就选择一种人生一种无悔一种执着。阴霾终会荡尽,狞笑终是无聊,卑鄙终会沉寂。


转载请标明出处:http://blog.csdn.net/android_for_james/article/details/51407697

源码下载地址我放在了文章的最底部


先来看看运行效果图:


一、前期准备

1.我们需要到百度API Store注册成为会员

百度API Store网址为:http://apistore.baidu.com


2.我们需要找到一个叫天气的api


3.点开后我们可以看到进行天气请求的一些帮助文档


4.服务器传回来的数据格式:我们可以看到是Json格式,天气信息保存在retData标签下


二、代码实现

首先我们需要将这个应用规划为三个类,一个主类,一个请求类,一个数据处理类

即:MainActivity,HttpRequestTools,AnalyseTools

1.MainActivity里主要做的事就是获取用户想要查询的城市并显示数据

public class MainActivity extends ActionBarActivity {    //注册完成后获取到的apikey    private static final String apiKey="你申请得到的apices";    //上传请求的地址信息    private String httpUrl = "http://apis.baidu.com/apistore/weatherservice/cityname";    //用户输入城市名称信息    private String httpArg = null;    private Handler handler=null;    private EditText cityET;    private Button search;    private TextView showInfo;    private ImageView weatherImg;    private String cityName=null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        InitEvents();        search.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v)            {                try {                    //注意在api文档中他没有提及直接用汉字传输信息是不行的,这里需要将用户输入的城市信息进行网络编码                    //例如北京编码完成后就变成了%E5%8C%97%E4%BA%AC                    cityName=(String)URLEncoder.encode(cityET.getText().toString(),"UTF-8");                } catch (UnsupportedEncodingException e) {                    e.printStackTrace();                }                httpArg="cityname="+cityName;                //System.out.println(httpArg);                //发送获取天气请求                HttpRequestTools httpRequestTools=new HttpRequestTools(httpUrl,httpArg,apiKey,showInfo,weatherImg,handler);                httpRequestTools.start();            }        });    }    public void InitEvents()    {        cityET=(EditText)findViewById(R.id.city_et);        search=(Button)findViewById(R.id.search);        showInfo=(TextView)findViewById(R.id.weatherInfo_tv);        weatherImg=(ImageView)findViewById(R.id.weatherInfo_img);        handler= new Handler()        {            @Override            public void handleMessage(Message msg) {                super.handleMessage(msg);            }        };    }}

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

public class HttpRequestTools extends Thread{    //因为是网络请求(耗时任务)所以需要在新线程中完成数据的获取,所以这个工具类需要继承自Thread    String httpUrl, httpArg ,apikey;    TextView show;    ImageView weatherImg;    Handler handler=null;        HttpRequestTools(String httpUrl, String httpArg, String apikey,TextView tv,ImageView weatherImg,Handler handler)    {        this.httpUrl=httpUrl;        this.httpArg=httpArg;        this.apikey=apikey;        this.show=tv;        this.weatherImg=weatherImg;        this.handler=handler;    }    @Override    public void run() {        super.run();        //用来做数据缓冲        StringBuffer sb=new StringBuffer();        BufferedReader reader=null;        String result=null;        //安装api组合URL        httpUrl=httpUrl+"?"+httpArg;        try {            URL url= new URL(httpUrl);            //向服务器发送获取天气数据请求            HttpURLConnection httpConnection=(HttpURLConnection)url.openConnection();            httpConnection.setRequestMethod("GET");            httpConnection.setRequestProperty("apikey",apikey);            httpConnection.connect();            //链接完成后就将数据保存到数据流中,这里是怕回传的数据如果直接按文本输出有可能是乱码,所以这里要重新编码一下            InputStream in=httpConnection.getInputStream();            reader=new BufferedReader(new InputStreamReader(in,"UTF-8"));            String str;            while((str=reader.readLine())!=null)            {                sb.append(str + "\n");            }            //数据接收完毕,先关闭上次流            reader.close();            //再关闭底层流            in.close();            result=sb.toString();            //回传回来的数据是Json格式我们需要将关键信息提取出来            AnalyseTools analyseTools=new AnalyseTools(result);            final String finalResult = analyseTools.AnalyseText();            //System.out.println(finalResult);            //更新数据            handler.post(new Runnable() {                @Override                public void run() {                    show.setText(finalResult);                    //按照天气配置图片                    if(finalResult.contains("多云"))                    {                        weatherImg.setImageResource(R.drawable.cloud);                    }else if(finalResult.contains("晴"))                    {                        weatherImg.setImageResource(R.drawable.sunny);                    }else if(finalResult.contains("雨"))                    {                        weatherImg.setImageResource(R.drawable.rain);                    }else if(finalResult.contains("阴"))                    {                        weatherImg.setImageResource(R.drawable.cloudy);                    }else if(finalResult.contains("雪"))                    {                        weatherImg.setImageResource(R.drawable.snow);                    }                }            });        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }}
3.AnalyseTools这个类用来处理服务器返回的Json格式的数据

public class AnalyseTools {    String receiveInfo=null;    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;    }}

转载请标明出处:http://blog.csdn.net/android_for_james/article/details/51407697

源码下载地址(在文章末尾有点击下载按钮):点击打开链接

源码下载备用链接:点击打开链接

如果对你有帮助,那就顶一下~~~

如果你喜欢我的文章欢迎关注我的博客:http://blog.csdn.net/android_for_james



1 0
原创粉丝点击