依赖:
//*5.0新控件的依赖*//* compile 'com.android.support:design:26.0.0-alpha1' compile 'com.facebook.fresco:fresco:0.12.0' //*RxJava与RxAndroid的依赖*//* compile 'io.reactivex:rxandroid:1.0.1' //*Retrofit与RxAndroid配置依赖*//* compile 'com.squareup.retrofit2:retrofit:2.0.2' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2' compile 'com.squareup.retrofit2:converter-gson:2.0.2' //*使Retrofit的转化器自定义完成数据的转化 // 就是我们可以接口中少写一些bean类 // compile 'com.squareup.retrofit2:converter-scalars:+'retrofit的封装
public class RetrofitHelper {
public static OkHttpClient okHttpClient;
public static ApiService apiService;
static {
getOkHttpClient();
}
public static OkHttpClient getOkHttpClient(){
if(okHttpClient == null){
synchronized (OkHttpClient.class) {
if(okHttpClient == null){
File fileDir = new File(Environment.getExternalStorageDirectory(), "cache");
long fileSize = 10 * 1024 * 1024;
okHttpClient = new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.writeTimeout(15, TimeUnit.SECONDS)
.cache(new Cache(fileDir, fileSize))
.build();
}
}
}
return okHttpClient;
}
public static ApiService getApiService(String url){
if(apiService == null){
synchronized (OkHttpClient.class) {
apiService = createApiService(ApiService.class,url);
}
}
return apiService;
}
private static <T>T createApiService(Class<T> tClass,String url) {
T t = new Retrofit.Builder()
.baseUrl(url)
.client(okHttpClient)
.addConverterFactory(ScalarsConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build()
.create(tClass);
return t;
}
private static class CommonParamsInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
String method = request.method();
String oldUrl = request.url().toString();
Log.e("---拦截器",request.url()+"---"+request.method()+"--"+request.header("User-agent"));
Map<String,String> map = new HashMap<>();
map.put("source","android");
if ("GET".equals(method)){
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(oldUrl);
if (oldUrl.contains("?")){
if (oldUrl.indexOf("?") == oldUrl.length()-1){
}else {
stringBuilder.append("&");
}
}else {
stringBuilder.append("?");
}
for (Map.Entry<String,String> entry: map.entrySet()) {
stringBuilder.append(entry.getKey())
.append("=")
.append(entry.getValue())
.append("&");
}
if (stringBuilder.indexOf("&") != -1){
stringBuilder.deleteCharAt(stringBuilder.lastIndexOf("&"));
}
String newUrl = stringBuilder.toString();
request = request.newBuilder()
.url(newUrl)
.build();
}else if ("POST".equals(method)){
RequestBody oldRequestBody = request.body();
if (oldRequestBody instanceof FormBody){
FormBody oldBody = (FormBody) oldRequestBody;
FormBody.Builder builder = new FormBody.Builder();
for (int i=0;i<oldBody.size();i++){
builder.add(oldBody.name(i),oldBody.value(i));
}
for (Map.Entry<String,String> entry:map.entrySet()) {
builder.add(entry.getKey(),entry.getValue());
}
FormBody newBody = builder.build();
request = request.newBuilder()
.url(oldUrl)
.post(newBody)
.build();
}
}
Response response = chain.proceed(request);
return response;
}
}
}
api的base_url的封装
public class Api {
public static String BASE_URL="https://www.zhaoapi.cn/";
}
接口
public interface ApiService {
/**
* Get基本请求,这里从Call改为Observable被观察者
* @param url
* @return
*/
@GET
public Observable<String> get(@Url String url);
/**
* Get请求提交表单
* @param url
* @param map
* @return
*/
@GET
public Observable<String> get(@Url String url, @QueryMap Map<String,String> map);
/**
* Post请求提交表单
* @param url
* @param map
* @return
*/
@FormUrlEncoded
@POST
public Observable<String> post(@Url String url , @FieldMap Map<String,String> map);
}
activity
public class MainActivity extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取控件
tv = (TextView) findViewById(R.id.text_tv);
//请求网络
getData();
}
/*
* 获取网络数据的方法
* */
private void getData() {
// String url = Api.BASE_URL+"ad/getAd";
RetrofitHelper.getApiService(Api.BASE_URL).get("ad/getAd")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String s) {
tv.setText(s);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
}
}