相信很多人在刚接触Android时都会做一个天气预报来了解Android,今天得空整理了一个简单Android天气预报Demo的制作,如下:

首先我们应该做的便是搞到一个天气预报的API以此来获取一个Android天气预报的数据,在这里我推荐注册和风天气个人开发者,认证时间1-3天,基本一下子就可以收到了认证成功的邮件。认证开发者后可以获得中国和海外城市的7天预报、逐3小时预报、实况天气、空气质量和生活指数,对比了一下其它家,和风真是算良心接口了,虽然我只需要实况天气这一个数据。不过读者也可以利用这个接口继续完善这个Android天气预报~~~~

和风天气API网址:https://www.heweather.com/douments/api/s6/weather-forecast  各位看官可以去里面注册获得key就可以继续开发天气预报啦

1、配置参数

        既然涉及到了网络请求,肯定应该想到的时权限所以我们先添加个权限,在AndroidManifest中添加

 

        然后我这里使用的是okhttp所以添加okhttp的依赖,在app下的build.gradle中的dependencies下添加

 compile 'com.squareup.okhttp3:okhttp:3.6.0'

2、好了,该配置的都配置完了。我们接下来就制作布局吧。布局我就截个图大家可以自由制作

         Android天气预报详解_第1张图片

3、制作完布局后,我们就继续回到Java代码中首先先初始化各种控件这个就不过多说明

         Android天气预报详解_第2张图片

4、接下来开始请求接口了,这里我是个按钮添加的点击事件然后调用的search方法如下:

public void search() {    Log.d(TAG, "search: 1111");    OkHttpClient client = new OkHttpClient();    String uri = "https://free-api.heweather.com/s6/weather?location=" + cityItem.getSelectedItem().toString() + "&key=你在和风天气上申请的key";    Request request = new Request.Builder()            .url(uri)            .build();    final Call call = client.newCall(request);    new Thread(new Runnable() {        @Override        public void run() {            Log.d(TAG, "run: 222222");            call.enqueue(new Callback() {                @Override                public void onFailure(Call call, IOException e) {                    Log.d(TAG, "onResponse: " + e);                }                @Override                public void onResponse(Call call, Response response) throws IOException {                    Message message=new Message();                    message.what=1;                    message.obj=response.body().string();                    handler.sendMessage(message);                }            });        }    }).start();}

        这里我们是先将城市和key拼接一个GET请求,然后封装至okhttp的Call中开启线程去请求,大家千万要注意Android的禁忌那就是不能在子线程更新UI,这个是千万不能去碰的,所以我这里使用了handler的方法回到主线程更新UI。

5、handler的使用,首先我们需要创建一个全局的handler来接受子线程或其他地方传来的消息

private Handler handler = new Handler() {    @Override    public void handleMessage(Message msg) {        if (msg.what==1){            String result=msg.obj.toString();            updateUI(result);            Log.d(TAG, "handleMessage: "+result);        }    }};

 这里面的msg.what==1就是一个标识符,代表你从哪传来的我们在请求成功后就发送消息,上面代码子线程中便有写到,如下:

          Android天气预报详解_第3张图片

   先制作一个Message消息然后将接口请求后的数据放入message中发出,我们就可以在之前定义的全局handler中去处理这个结果,在里面调用更新UI的方法。

6、更新UI,我们先来看一下天气预报接口返回的数据吧

        Android天气预报详解_第4张图片

       他这里返回的JSON是一层套一层,不过我们不要着急,一步一步的来解析,在这个项目中我使用的是Android自带的json工具来解析的,好了,我们继续。我们就已拿 "now" 现在的数据举例吧。

      首先我们看到最外层的 "HeWeather6" ,它的后面是一个 [ ] 包含的数据,所以我们可以得知他是一个JSONArray于是外面我们先使用Android的JSONArray来获取它里面的数据

JSONArray jsonArray=new JSONObject(result).getJSONArray("HeWeather6");

      我们进去之后呢就看到了一个 { } 的符号将所有数据都包揽起来了这就代表了只是一个JSONObject,我们再来用刚刚获取到的jsonarray来获取这个JSONObject,如下:

JSONObject jsonObject=jsonArray.getJSONObject(0);

      好了现在我们已经到很里面了,可以看到都是一个 " "加 { } 的结构这代表这他们都是有名字的JSONObject,我们继续来获取我们想要的 "now" 

JSONObject now=jsonObject.getJSONObject("now");

     OK,我们已经获取到了,接下来就把它里面的一个个数据放到页面中吧。更新UI的详细方法如下:

public void updateUI(String result){    try {        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");        timeText.setText(simpleDateFormat.format(new Date()));        JSONArray jsonArray=new JSONObject(result).getJSONArray("HeWeather6");        JSONObject jsonObject=jsonArray.getJSONObject(0);        JSONObject now=jsonObject.getJSONObject("now");        cityText.setText(cityItem.getSelectedItem().toString());        nowWeather.setText(now.get("cond_txt")+"");        nowTmp.setText(now.get("tmp")+"℃");        nowWindDir.setText(now.get("wind_dir")+"");        nowWindSc.setText(now.get("wind_sc")+"级");        JSONArray jsonArray1=jsonObject.getJSONArray("daily_forecast");        JSONObject todayJson= (JSONObject) jsonArray1.get(0);        tmpMaxText.setText(todayJson.get("tmp_max")+"℃");        tmpMinText.setText(todayJson.get("tmp_min")+"℃");        dayTimeText.setText(todayJson.get("cond_txt_d")+"");        nightText.setText(todayJson.get("cond_txt_n")+"");        windDirText.setText(todayJson.get("wind_dir")+"");        windScText.setText(todayJson.get("wind_sc")+"级");        JSONObject tomorrowJson= (JSONObject) jsonArray1.get(1);        tomorrowTmpText.setText(tomorrowJson.get("cond_txt_d")+"");        tomorrowCondText.setText(tomorrowJson.get("tmp_min")+"-"+tomorrowJson.get("tmp_max")+"℃");        Log.d(TAG, "updateUI: "+todayJson);        Log.d(TAG, "updateUI: "+jsonArray);        Log.d(TAG, "updateUI: "+now);    } catch (JSONException e) {        e.printStackTrace();    }

   到这里我们这个Android天气预报就已经全部完成了,大家有什么不懂的可以留言,我会及时回复的。最后将源码放上,以供大家参考。Android天气预报Demo源码

 

       

更多相关文章

  1. Android(四)数据存储之四网络
  2. [数据图表]Android军团超级黑马亚马逊平板电脑Amazon Kindle Fir
  3. 【Android的从零单排开发日记】之入门篇(七)——Android数据存储(上
  4. android 数据储存——网络存储(5)
  5. android与html5的交互——数据库操作,UI操作,以及html5的localStor
  6. PC监控通过网络数据监控ANDROID屏幕
  7. 王家林的81门一站式云计算分布式大数据&移动互联网解决方案课程
  8. Android:使用JDBC链接MySQL数据库
  9. Android数据库组件Room

随机推荐

  1. AndroidStudio使用[原创]
  2. Android(安卓)RecyclerView与ListView局
  3. Android常用控件之FragmentTabHost的使用
  4. 1.1安卓系统架构
  5. Android(安卓)三种动画详解及简单实例
  6. android https 连接建立
  7. android:自定义监听(简单)
  8. Android(安卓)学习之Camera拍照流程
  9. vnc 项目的几点总结
  10. [置顶] android 按钮两次点击事件区分