天氣開發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佈局實現側滑菜單欄效果是,我們要給作爲菜單欄的佈局設置背景色,這樣就不會導致側滑菜單欄出現的時候,被黑色的陰影蓋住,看不見菜單欄。

發佈了43 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章