天气开发3——第二行代码(酷欧天气)

上一篇
我们已经把数据库构建好,同时创建了Utility类,明确了数据库的操作

界面设计

这里我只做简单的介绍,把整个设计的理念讲述一下:

我们创建一个ChooseAreaFragment,它的主要作用为:App一开始时显示这个界面,默认显示省份的信息。在这个界面中我们可以进行省,市,县的选择。当选择了县之后,我们就跳转到了WeatherActivity。此时,我们的ChooseAreaFragment作为WeatherActivity的滑动菜单栏。所以我们一定要在ChooseAreaFragment中对此时Fragment所在位置进行判断:

  if (getActivity() instanceof MainActivity) {
                        Intent intent = new Intent(getActivity(), WeatherActivity.class);
                        intent.putExtra("weather_id", weatherId);
                        startActivity(intent);
                        getActivity().finish();
                    } else if (getActivity() instanceof WeatherActivity) {
                        WeatherActivity activity =(WeatherActivity) getActivity();
                        activity.drawerLayout.closeDrawers();
                        activity.refrshLayout.setRefreshing(true);
                        activity.requestWeather(weatherId);
                    }

我们要注意:

在Okhttp的回调函数中,我们不能进行UI操作,Android的UI操作必须要在主线程中进行,所以我们使用了runOnUiThread执行UI操作。

在Fragment中,我们在onActivityCreated中执行监听事件的操作。

在ChooseAreaFragment的操作基本流程是:

我们定义了currentLevel用于判断当前的省,市,县级别,根据级别来进行界面的显示。打开App时,默认状态下显示的是全国省份的信息,一开始我们需要判断数据库中是否存在省份信息,如果不存在就去服务器上寻找。当然,最初是向服务器获取数据存储到数据库中的。这里我只贴了查询省份的代码:


    private void queryProvinces() {
        title.setText("中国");
        btn_back.setVisibility(View.GONE);//不显示返回按钮
        provinceList = DataSupport.findAll(Province.class);//查找数据库中所有的内容
        if (provinceList.size() > 0) {
            dataList.clear();//清除列表中内容

            for (Province province : provinceList) {
                dataList.add(province.getProvinceName());
            }
            adapter.notifyDataSetChanged();
            listView.setSelection(0);
            currentLevel = LEVEL_PROVINCE;
        } else {
            String address = ADDRESS;
            queryFromServer(address, "province");//从服务器中寻找数据
        }
    }
private void queryFromServer(String address, final String type){
        showProgressDialog();
        HttpUtil.sendOkHttpRequest(address, new Callback() {
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String responseText = response.body().string();
                boolean result = false;
                if ("province".equals(type)) {
                    result = Utility.handleProvinceResponse(responseText);
                } else if ("city".equals(type)) {
                    result = Utility.handleCityResponse(responseText, selectedProvince.getId());
                } else if ("county".equals(type)) {
                    result = Utility.handleCountyResponse(responseText, selectedCity.getId());
                }
                if (result) {
                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            closeProgressDialog();
                            if ("province".equals(type)) {
                                queryProvinces();
                            } else if ("city".equals(type)) {
                                queryCities();
                            } else if ("county".equals(type)) {
                                queryCounties();
                            }
                        }
                    });
                }
            }

            @Override
            public void onFailure(Call call, IOException e) {
                // 通过runOnUiThread()方法回到主线程处理逻辑
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        closeProgressDialog();
                        makeText(getContext(), "加载失败", LENGTH_SHORT).show();
                    }
                });
            }
        });
    }

注意:在WeatherActivity中获取天气信息的地址为:

String weatherUrl = "https://api.heweather.com/x3/weather?cityid=" + weatherId + "&key=bc0418b57b2d4918819d3974ac1285d9";

 public void requestWeather(final String weatherId) {
        String weatherUrl = "https://api.heweather.com/x3/weather?cityid=" + weatherId + "&key=bc0418b57b2d4918819d3974ac1285d9";


        HttpUtil.sendOkHttpRequest(weatherUrl, new Callback() {
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String responseText = response.body().string();
                final Weather weather = Utility.handleWeatherResponse(responseText);

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        if (weather != null && "ok".equals(weather.status)) {
                            SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(WeatherActivity.this).edit();
                            editor.putString("weather", responseText);
                            editor.apply();
                            showWeatherInfo(weather);
                        } else {
                            Toast.makeText(WeatherActivity.this, "获取天气信息失败", Toast.LENGTH_SHORT).show();
                        }

                        refrshLayout.setRefreshing(false);
                    }
                });

            }

            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(WeatherActivity.this, "获取天气信息失败", Toast.LENGTH_SHORT).show();
                        refrshLayout.setRefreshing(false);
                    }
                });
            }
        });
    }

下载更新背景图:

    private void loadPic() {
        String address = "http://guolin.tech/api/bing_pic";
        HttpUtil.sendOkHttpRequest(address, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String pic = response.body().string();
                SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(WeatherActivity.this).edit();
                editor.putString("pic", pic);
                editor.apply();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Glide.with(WeatherActivity.this).load(pic).into(back_img);
                    }
                });


            }
        });
    }

我们在布局中使用了SwipeRefreshLayout,这样我们可以手动更新数据:

//设置监听事件
        refrshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                requestWeather(weatherId);
                loadPic();
            }
        });

注意:在使用DrawerLayout布局实现侧滑菜单栏效果是,我们要给作为菜单栏的布局设置背景色,这样就不会导致侧滑菜单栏出现的时候,被黑色的阴影盖住,看不见菜单栏。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值