美文网首页
构建自己天气APP(三)

构建自己天气APP(三)

作者: BigTotoro | 来源:发表于2017-10-22 22:53 被阅读0次

前面的文章讲了如何编写UI和处理数据。这是关于天气APP的最后一篇文章了,会着重讲解如何处理一个完整APP的逻辑运转。希望能帮到你。

进入主界面的时候

  一进入主界面,我认为最好的形式是直接定位当前所在地的城市。所以应该直接使用高德的sdk来定位,然后用OkHttp来拉取数据,Gson来解析数据,然后显示。这没什么问题,但是有一个需要注意的地方就是加载这个方法应该就是下拉刷新的逻辑。

   public void onRefresh() {
        srlRefreshLayout.setRefreshing(true);
        if (NetUtil.isNetConnectivity(this)) {
            String city = mDataService.getCurrentCityId();
            if (city == null) {
                LocationUtil.locationCity(this.getApplicationContext(), this);
            } else {
                mDataService.loadWeatherInfo(city, this);
            }
        } else {
            mSnackbar.setText(getString(R.string.noNet)).show();
            srlRefreshLayout.setRefreshing(false);
        }
    }

  我的处理是在开始的时候在后台开启一个Service,就是DataService,每一次加载数据都通过它来完成。同时DataService还保存了当前城市的id。想想为什么这样呢?其实说起来也简单,就是假设你一进来就是没有网的,那么加载就会失败,mDataService.getCurrentCityId()就会为null。这时也就说明了定位是失败的,当前所在地都是没有确定的。这时就需要重新去定位。如果定位成功的话,mDataService.getCurrentCityId()就试不是null,就不会重复定位,只是加载当前城市的天气数据了。
  这段逻辑的科复用性相当高,任何情况,刷新数据用它就可也以,甚至没网也是可以的。

后台加载数据

public void loadWeatherInfo(String city, final OnLoadFinishListener loadFinishListener) {
        String url = UrlBuilder.getWeatherInfoUrl(city);
        HttpUtil.sendRequest(url, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                mainThread.post(new Runnable() {
                    @Override
                    public void run() {
                        loadFinishListener.loadFail();
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //加载成功就处理数据
                String json = response.body().string();
                Gson gson = new Gson();
                JsonForWeather jsonWeather = gson.fromJson(json, JsonForWeather.class);
                final Weather weather = jsonWeather.changeToWeather();
                mCurrentWeather = weather;
                mainThread.post(new Runnable() {
                    @Override
                    public void run() {
                        loadFinishListener.loadSuccess(weather);
                    }
                });
                //加载谁,谁就是当前要显示的城市数据
                mCurrentCityId = weather.getNowWeather().getId();
                //存储当前城市到城市列表,为了之后管理城市使用
                PreferenceUtil.addCity(weather.getNowWeather().getName(), weather.getNowWeather().getId());
            }
        });
    }

  我们不妨想想什么时候需要加载数据

  • 在主界面下拉刷新
  • 查询了别的城市
  • 在城市列表里面点击了别的城市

  这三段的加载情况其实都是一样的,那就是点击或者下拉了之后,加载数据,然后到主界面给用户看。所以这里就有必要写一个自定义的接口来用作回调,这里我定义的是

public interface OnLoadFinishListener {
    void loadSuccess(Weather weather);

    void loadFail();
}

  也就是说呢,调用DataService的loadWeatherInfo方法,必须传入一个回调用的接口,把加载的数据传递出去,做各种各样的处理。这样,不论在任何一个界面,需要加载数据并且显示,这段代码都是可用的。

其实天气APP的逻辑和交互式不多的,主要就是加载数据,展示数据,这里我说了我对加载数据和展示数据的逻辑。其他的逻辑都很简单了,大家可以按照自己的想法来搭建。主要就是不要让代码拧在一起,想起来什么写什么,要有一定的战略性,能做到复用。最后附上项目源码。如果能帮到你的话,不胜荣幸。

相关文章

  • 构建自己天气APP(三)

    前面的文章讲了如何编写UI和处理数据。这是关于天气APP的最后一篇文章了,会着重讲解如何处理一个完整APP的逻辑运...

  • 构建自己的天气APP(二)

      上篇文章简要说明了UI的构建,这次来聊来怎么加载并且处理数据。 定位   打开一个天气app,你可能最想先看到...

  • 构建自己的天气APP(一)

      学习android最大的快乐莫过于写自己的APP,并且分享给亲朋好友使用,所以想写这一些列的文章,来记述写一个...

  • CoolWeather

    构建数据库模型 因为是构建一个天气的APP,需要显示各地的天气,所以需要构建一个数据库模型存放省、市、县各级的数据...

  • iOS-APP 构建相似App多种方式整理

    iOS APP 构建相似App多种方式整理 利用Build Configuration来构建相似App原地址:iO...

  • Ionic 4 配置App icon 和splash

    构建App配置app icon 和 splash是必须的步骤,通过ionic 构建hybrid app 同样需要配...

  • Flutter Bug总结

    Problem 1.上传App Store构建版本,上传成功,App Store Connect并不显示构建版本?...

  • 基于MVVM构建聊天App (三)网络请求封装

    Github 基于MVVM构建聊天App (三)网络请求封装[https://github.com/dengfen...

  • BaseProject快速构建自己的APP

    关于BaseProject BaseProject是一个快速构建app工程的开源项目,目的是为了更加方便的初始化一...

  • react 项目构建

    前言: 构建React项目的几种方式: 构建:create-react-app 快速脚手架 构建:generato...

网友评论

      本文标题:构建自己天气APP(三)

      本文链接:https://www.haomeiwen.com/subject/aegnuxtx.html