【版权说明】
1. 请支持原创,转载请注明出处:https://blog.csdn.net/cbk861110/article/details/86665564
2. 项目源码&框架说明&技术更新实现 请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,框架和技术实现不妥之处,请帮忙指正),谢谢!
---------------------
基于MVVM框架的高德天气APP:
网络应用框架和组件实现:
- Retrofit 2.0 使用教程:热门的Android网络请求库
- OkHttp3 使用教程:Http第三方库,Retrofit底层通过OkHttp实现网络请求
一、 技术背景:
使用Android主流的retrofit2&okhttp3封装网络请求,并实现高德天气当前&未来天气查询功能。
二、技术实现:
1. okhttp3+retrofit2 的网络请求代理类配置&实现:
public class RetrofitManager {
private static final int DEFAULT_CONNECT_TIME = 20;
private static final int DEFAULT_WRITE_TIME = 50;
private static final int DEFAULT_READ_TIME = 30;
private OkHttpClient mOkHttpClient;
private Retrofit mRetrofit;
private static RetrofitManager mRetrofitManager;
private RetrofitManager() {
initOkHttpClient();
initRetrofit();
}
private void initRetrofit() {
mRetrofit = new Retrofit.Builder()
.baseUrl(ApiContants.AMAP_BASE_URL)//设置服务器路径
.client(mOkHttpClient)//设置使用okhttp网络请求
.addConverterFactory(GsonConverterFactory.create())//添加转化库,默认是Gson
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())//添加回调库,采用RxJava
.build();
}
private void initOkHttpClient() {
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
mOkHttpClient = new OkHttpClient.Builder()
.connectTimeout(DEFAULT_CONNECT_TIME, TimeUnit.SECONDS)//连接超时时间
.writeTimeout(DEFAULT_WRITE_TIME, TimeUnit.SECONDS)//设置写操作超时时间
.readTimeout(DEFAULT_READ_TIME, TimeUnit.SECONDS)//设置读操作超时时间
.addInterceptor(httpLoggingInterceptor)
.build();
}
public synchronized static RetrofitManager getInstance() {
if (mRetrofitManager == null) {
mRetrofitManager = new RetrofitManager();
}
return mRetrofitManager;
}
/**
* 泛型方法
*/
public <T> T create(Class<T> service) {
return mRetrofit.create(service);
}
2. 高德天气查询api 封装(使用retrofit2框架的提供的注解机制,组装请求报文):
public interface ApiService {
//https://restapi.amap.com/v3/weather/weatherInfo?city=110101&key=3b6729d0c40f23fde7c55ae90ee0921d&extensions=base&output=JSON
@FormUrlEncoded
@POST(ApiContants.AMAP_WEATHER_GET)
Observable<LiveWeatherResponseData> livesweatherPost(
@Field("city") String city,
@Field("key") String key,
@Field("extensions") String extensions,
@Field("output") String output
);
@FormUrlEncoded
@POST(ApiContants.AMAP_WEATHER_GET)
Observable<AllForecastResponseData> allweatherPost(
@Field("city") String city,
@Field("key") String key,
@Field("extensions") String extensions,
@Field("output") String output
);
/*@GET
Observable<AllForecastResponseData> weatherGet(
@Url String url);*/
@GET(ApiContants.AMAP_WEATHER_GET)
Observable<LiveWeatherResponseData> livesweatherGet(
@Query("city") String city,
@Query("key") String key,
@Query("extensions") String extensions,
@Query("output") String output
);
@GET(ApiContants.AMAP_WEATHER_GET)
Observable<AllForecastResponseData> allweatherGet(
@Query("city") String city,
@Query("key") String key,
@Query("extensions") String extensions,
@Query("output") String output
);
}
3. 天气查询apis的使用举例:
public class WeatherRequestClient {
private static WeatherRequestClient weatherRequestClient;
private static ApiService apiService;
private WeatherRequestClient() {
createApiClient();
}
private ApiService createApiClient() {
if (apiService == null) {
apiService = RetrofitManager.getInstance().create(ApiService.class);
}
return apiService;
}
public synchronized static WeatherRequestClient getInstance() {
if (weatherRequestClient == null) {
weatherRequestClient = new WeatherRequestClient();
}
return weatherRequestClient;
}
/*高德天气:当前天气查询接口 Post*/
public Observable<LiveWeatherResponseData> liveWeatherPost(final String adcode) {
return apiService.livesweatherPost(adcode,
ApiContants.AMAP_USER_KEY_VALUE,
ApiContants.AMAP_USER_EXTENSION_VALUE_BASE,
ApiContants.AMAP_USER_OUTPUT_VALUE)
.subscribeOn(Schedulers.io());
}
/*高德天气:预报天气查询接口 Post*/
public Observable<AllForecastResponseData> forecastWeatherPost(final String adcode) {
return apiService.allweatherPost(adcode,
ApiContants.AMAP_USER_KEY_VALUE,
ApiContants.AMAP_USER_EXTENSION_VALUE_ALL,
ApiContants.AMAP_USER_OUTPUT_VALUE)
.subscribeOn(Schedulers.io());
}
/*高德天气:预报天气查询接口 Get*/
/*public Observable<AllForecastResponseData> forecastWeatherGet(final String adcode) {
String url = "https://restapi.amap.com/v3/weather/weatherInfo?city=110101&key=3b6729d0c40f23fde7c55ae90ee0921d&extensions=all&output=JSON\n";
return apiService.weatherGet(url).subscribeOn(Schedulers.io());
}*/
/*高德天气:当前天气查询接口 Get*/
public Observable<LiveWeatherResponseData> livesWeatherGet(final String adcode) {
return apiService.livesweatherGet(adcode,
ApiContants.AMAP_USER_KEY_VALUE,
ApiContants.AMAP_USER_EXTENSION_VALUE_ALL,
ApiContants.AMAP_USER_OUTPUT_VALUE)
.subscribeOn(Schedulers.io());
}
/*高德天气:预报天气查询接口 Get*/
public Observable<AllForecastResponseData> forecastWeatherGet(final String adcode) {
return apiService.allweatherGet(adcode,
ApiContants.AMAP_USER_KEY_VALUE,
ApiContants.AMAP_USER_EXTENSION_VALUE_ALL,
ApiContants.AMAP_USER_OUTPUT_VALUE)
.subscribeOn(Schedulers.io());
}
//===================================================================================================
//for test
/*高德天气:当前天气查询接口:深圳*/
private void getShenzhenForecastWeather() {
WeatherRequestClient.getInstance().liveWeatherPost("440300");//深圳:adcode:440300 citycode:0755
}
-------------------------------------------
文章目录(未完,待续):
一:android 应用子功能及移动框架总述 https://blog.csdn.net/cbk861110/article/details/86665564
二:android 高德天气API说明及城市天气查询实现 https://blog.csdn.net/cbk861110/article/details/86665655
三:android 自定义控件实现(ActionBar + PageIndicatorView) https://blog.csdn.net/cbk861110/article/details/86665790
四:android ViewPager实现左右页面滑动切换 https://blog.csdn.net/cbk861110/article/details/86665964
五:android应用权限动态申请 https://blog.csdn.net/cbk861110/article/details/86666321
六:android RecyclerView 封装及使用 https://blog.csdn.net/cbk861110/article/details/86666392
七:android Xutils3文件下载实现(高德天气城市配置) https://blog.csdn.net/cbk861110/article/details/86666573
八:android DiskLruCache 磁盘缓存 封装和使用 https://blog.csdn.net/cbk861110/article/details/86666664
九:android ThreadPoolExecutor线程池 封装及使用 https://blog.csdn.net/cbk861110/article/details/86667101
十:android 天气网络请求框架(retrofit2&okhttp3&Gson) 封装及使用 https://blog.csdn.net/cbk861110/article/details/86667375
十一:android RxAndroid(响应式编程) 异步网络请求实现 https://blog.csdn.net/cbk861110/article/details/86669178
十二:android DataBinding 数据和UI双向绑定实现 https://blog.csdn.net/cbk861110/article/details/86669708
十三:android room数据库 天气数据读写实现 https://blog.csdn.net/cbk861110/article/details/86670354
十四:android LiveData 使用方法(实现城市天气自动刷新) https://blog.csdn.net/cbk861110/article/details/86670531
十五:android ViewModel 使用方法 https://blog.csdn.net/cbk861110/article/details/86670703
十六:android 集成友盟消息推送机制(U-Push) https://blog.csdn.net/cbk861110/article/details/86683849
---------------------
【版权说明】
1. 请支持原创,转载请注明出处:https://blog.csdn.net/cbk861110/article/details/86665564
2. 项目源码&框架说明&技术更新实现 请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,框架和技术实现不妥之处,请帮忙指正),谢谢!