高德天气应用开发之十:android retrofit2&okhttp3&Gson 网络请求框架 封装和使用

版权声明:本文为博主原创文章,未经允许不得转载,如有问题,欢迎指正,谢谢! https://blog.csdn.net/cbk861110/article/details/86667375

【版权说明】

1. 请支持原创,转载请注明出处:https://blog.csdn.net/cbk861110/article/details/86665564

2. 项目源码&框架说明&技术更新实现 请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,框架和技术实现不妥之处,请帮忙指正),谢谢!

--------------------- 

基于MVVM框架的高德天气APP:


网络应用框架和组件实现:

 一、 技术背景:

使用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,框架和技术实现不妥之处,请帮忙指正),谢谢!

猜你喜欢

转载自blog.csdn.net/cbk861110/article/details/86667375