依赖
//retrofit compile 'com.squareup.retrofit2:retrofit:+' compile 'com.squareup.retrofit2:converter-gson:+' //Rxjava2 compile 'io.reactivex.rxjava2:rxjava:+' compile 'io.reactivex.rxjava2:rxandroid:+' //让retrofit支持Rxjava2 compile 'com.squareup.retrofit2:adapter-rxjava2:+'
--------------------------------------------------------------------------------------------
public interface ApiService { @POST("quarter/getAd") @FormUrlEncoded Observable<BannerBean> banner(@FieldMap Map<String, String> map); }
--------------------------------------------------------------------------------------------
public class Constants { public static String base_url="https://www.zhaoapi.cn/"; }
--------------------------------------------------------------------------------------------
public class MainActivity extends AppCompatActivity implements IView { private static final String TAG = "MainActivity"; private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = findViewById(R.id.tv); Presenter presenter = new Presenter(this); HashMap<String, String> stringStringHashMap = new HashMap<>(); stringStringHashMap.put("", ""); presenter.getData(stringStringHashMap, new Model()); } @Override public void showdata(BannerBean bannerBean) { Log.e(TAG, "showdata: ----" + bannerBean.getCode()); tv.setText(bannerBean.getCode()+""); } }
--------------------------------------------------------------------------------------------
public class Model { private static final String TAG = "Model"; public void getnetdate(Map<String, String> map, final ModelListener modelListener) { RetrofitUtil.getInstence().API().banner(map) //后台线程获取数据,主线程显示 .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new Observer<BannerBean>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(BannerBean bannerBean) { modelListener.successlistener(bannerBean); } @Override public void onError(Throwable e) { Log.e(TAG, "onError: ---" + e.toString()); } @Override public void onComplete() { } }); } public interface ModelListener { void successlistener(BannerBean bannerBean); void errorlistener(String s); } }
--------------------------------------------------------------------------------------------
public class Presenter { IView iView; public Presenter(IView iView) { this.iView = iView; } public void getData(Map<String, String> map, Model model) { model.getnetdate(map, new Model.ModelListener() { @Override public void successlistener(BannerBean bannerBean) { iView.showdata(bannerBean); } @Override public void errorlistener(String s) { } }); } }
--------------------------------------------------------------------------------------------
public class RetrofitUtil { private static RetrofitUtil RetrofitUtil;//工具类对象 private static ApiService ApiService;//请求网络接口 public static OkHttpClient okHttpClient; //静态块,获取OkHttpClient对象 static { getOkHttpClient(); } //单例锁模式 public static RetrofitUtil getInstence() { if (RetrofitUtil == null) { synchronized (RetrofitUtil.class) { if (RetrofitUtil == null) { RetrofitUtil = new RetrofitUtil(); } } } return RetrofitUtil; } //单例模式获取okhttp 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() .addInterceptor(new MyInter()) //打印拦截器日志 .connectTimeout(15, TimeUnit.SECONDS)//设置连接超时时间 .readTimeout(15, TimeUnit.SECONDS)//设置读取超时时间 .writeTimeout(15, TimeUnit.SECONDS)//设置写入超时时间 //.cache(new Cache(fileDir,fileSize))//写入sd卡 .build(); } } } return okHttpClient; } //私有的无参构造 private RetrofitUtil() { Retrofit retrofit = new Retrofit.Builder() .baseUrl(Constants.base_url) .addConverterFactory(GsonConverterFactory.create())//添加gson转换器 .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//添加rxjava转换器 .client(okHttpClient)//添加okhttp .build(); ApiService = retrofit.create(ApiService.class); } //获取 public ApiService API() { return ApiService; } //拦截器 static class MyInter implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Request.Builder request_builder = request.newBuilder(); if ("GET".equals(request.method())) { HttpUrl.Builder builder = request.url().newBuilder(); HttpUrl build = builder.addQueryParameter("source", "android") .addQueryParameter("appVersion", "101") .addQueryParameter("token", "25D4D2D717DDB8BBE5A24CF2F16C3E16") .build(); request = request_builder.url(build).build(); } if ("POST".equals(request.method())) { if (request.body() instanceof FormBody) { System.out.println("FormBody开始添加公共参数"); FormBody.Builder builder = new FormBody.Builder(); FormBody body = (FormBody) request.body(); for (int i = 0; i < body.size(); i++) { builder.add(body.encodedName(i), body.encodedValue(i)); } body = builder.add("source", "android") .add("appVersion", "101") .add("token", "25D4D2D717DDB8BBE5A24CF2F16C3E16") .build(); System.out.println("开始添加公共参数55555"); request = request_builder.post(body).build(); } //因为传送文件要用到 @Multipart注解 else if (request.body() instanceof MultipartBody) { MultipartBody body = (MultipartBody) request.body(); MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM); builder.addFormDataPart("source", "android") .addFormDataPart("appVersion", "101") .addFormDataPart("token", "25D4D2D717DDB8BBE5A24CF2F16C3E16"); List<MultipartBody.Part> parts = body.parts(); for (MultipartBody.Part part : parts) { builder.addPart(part); } request = request_builder.post(builder.build()).build(); } } return chain.proceed(request); } /** * 添加公共参数 * * @param oldRequest * @return */ private Request addParam(Request oldRequest) { HttpUrl.Builder builder = oldRequest.url() .newBuilder() .setEncodedQueryParameter("source", "android") //自己的token .setEncodedQueryParameter("token", "25D4D2D717DDB8BBE5A24CF2F16C3E16") .setEncodedQueryParameter("appVersion", "101"); Request newRequest = oldRequest.newBuilder() .method(oldRequest.method(), oldRequest.body()) .url(builder.build()) .build(); return newRequest; } } }