解决需求:只有一个baseurl,且baseurl可以动态配置,配置后可保存也可更新。
前段时间做项目,遇到这样一个需求,APP要求访问的服务主地址可以用户自己配置,且配置过后,还可以手动更新。需求分析一下明白了,就是想动态配置主域名嘛,其余路径不变。刚好项目中我用的又是Retrofit,好吧,明白了,就是想动态配置那个baseurl嘛。配置了肯定要保存,这个简单,就用SharedPreference保存就行,至于更新嘛,就是刷新SharedPreference的值。好了,需求分析完了,技术解决思路也想好了,下面开始步入正题。Retrofit比较早的版本中,是有一个接口可以动态更新这个baseurl的,不过后来被删了。好吧,官方的既然没有了,那我们看看网上有没有轮子吧^……^,毕竟重复造轮子是不能忍的。这里我发现了一个很好的轮子RetrofitUrlManager,完全可以满足我的这个需求。
1.添加这个框架的依赖。
compile 'me.jessyan:retrofit-url-manager:1.4.0'
2.将okhttp的初始化换成RetrofitUrlManager的with方法。
this.mOkHttpClient=RetrofitUrlManager.getInstance()
.with(newOkHttpClient.Builder())//RetrofitUrlManager 初始化
.readTimeout(5, TimeUnit.SECONDS)
.connectTimeout(5, TimeUnit.SECONDS)
.build();
//从SharedPreference获取存的baseurl,不为空设置sp中,为空设置默认的。
mRetrofit = new Retrofit.Builder()
.baseUrl(MyUtil.MAIN_URL)//通用的url
.client(mOkHttpClient)
.addConverterFactory(GsonConverterFactory.create())//Gson转换工厂
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//与Rxjava结合
.build();
3.调用设置全局baseurl的方法,设置此全局baseurl会替换retrofit初始化时配置的那个baseurl。
RetrofitUrlManager.getInstance().setGlobalDomain("你想要配置的baseurl"); //TODO:将数据存到SP里面。