前面的文章讲了如何编写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的逻辑和交互式不多的,主要就是加载数据,展示数据,这里我说了我对加载数据和展示数据的逻辑。其他的逻辑都很简单了,大家可以按照自己的想法来搭建。主要就是不要让代码拧在一起,想起来什么写什么,要有一定的战略性,能做到复用。最后附上项目源码。如果能帮到你的话,不胜荣幸。
网友评论