依赖
//Gson
implementation 'com.google.code.gson:gson:2.4'
//okhttp
implementation 'com.squareup.okhttp3:okhttp:3.9.0'
//日志拦截器
implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'
//配置retrofit2.0
implementation 'com.squareup.retrofit2:retrofit:+'
//ConverterFactory的Gson依赖包
implementation "com.squareup.retrofit2:converter-gson:2.3.0"
//Rxjava2需要依赖
implementation 'io.reactivex.rxjava2:rxjava:+'
implementation 'io.reactivex.rxjava2:rxandroid:+'
//让retrofit支持Rxjava2
implementation 'com.squareup.retrofit2:adapter-rxjava2:+'
权限
<uses-permission android:name="android.permission.INTERNET" />
存放接口的类
public class ApiConstant {
public static final Integer SUCCEDCODE = 20000;
public static final String BASE_URL = "https://www.zhaobanzhilian.com/api/";//通用前缀
}
api
@GET
Observable<ResponseBody> get(@Url String url);
@FormUrlEncoded
@POST
Observable<ResponseBody> post(@Url String url, @FieldMap Map<String, Object> map);
@PUT
Observable<ResponseBody> put(@Url String url, @QueryMap Map<String, String> map);
@DELETE
Observable<ResponseBody> delete(@Url String url);
@POST
Observable<ResponseBody> Image(@Url String url, @Body MultipartBody body);
callback
public interface CallBack<T> {
void success(T data);
void error(T error);
}
model
public interface Model<T> {
void onGetSetData(String url, Class clas, CallBack callBack);
void onPostSetDataBody(String url,Map<String, Object> body, Class clas, CallBack callBack);
void onDeleteSetData(String url, Class clas, CallBack callBack);
void onPutSetData(String url, Map<String, String> map, Class clas, CallBack callBack);
void imgList(String url,List<Object> list, Class clas, CallBack callBack);
void imgPath(String url,String path, Class clas, CallBack callBack);
}
ModelImpl
public class ModelImpl implements Model {
@Override
public void onGetSetData(String url, final Class clas, final CallBack callBack) {
RetrofitManager.getInstence().get(url, new RetrofitManager.HttpListener() {
@Override
public void onSuccess(String data) {
Object o = new Gson().fromJson(data, clas);
callBack.success(o);
}
@Override
public void onFail(String error) {
callBack.error(error);
}
});
}
@Override
public void onDeleteSetData(String url, final Class clas, final CallBack callBack) {
RetrofitManager.getInstence().delete(url, new RetrofitManager.HttpListener() {
@Override
public void onSuccess(String data) {
Object o = new Gson().fromJson(data, clas);
callBack.success(o);
}
@Override
public void onFail(String error) {
callBack.error(error);
}
});
}
@Override
public void imgList(String url, List list, Class clas, CallBack callBack) {
RetrofitManager.getInstence().imageList(url, list, new RetrofitManager.HttpListener() {
@Override
public void onSuccess(String data) {
Object o = new Gson().fromJson(data, clas);
callBack.success(o);
}
@Override
public void onFail(String error) {
callBack.error(error);
}
});
}
@Override
public void imgPath(String url, String path, Class clas, CallBack callBack) {
RetrofitManager.getInstence().imagePath(url, path, new RetrofitManager.HttpListener() {
@Override
public void onSuccess(String data) {
Object o = new Gson().fromJson(data, clas);
callBack.success(o);
}
@Override
public void onFail(String error) {
callBack.error(error);
}
});
}
@Override
public void onPutSetData(String url, Map map, final Class clas, final CallBack callBack) {
RetrofitManager.getInstence().put(url, map, new RetrofitManager.HttpListener() {
@Override
public void onSuccess(String data) {
Object o = new Gson().fromJson(data, clas);
callBack.success(o);
}
@Override
public void onFail(String error) {
callBack.error(error);
}
});
}
@Override
public void onPostSetDataBody(String url, final Map map, final Class clas, final CallBack callBack) {
RetrofitManager.getInstence().post(url, map, new RetrofitManager.HttpListener() {
@Override
public void onSuccess(String data) {
Object o = new Gson().fromJson(data, clas);
callBack.success(o);
}
@Override
public void onFail(String error) {
callBack.error(error);
}
});
}
}
presenter
public interface Presenter {
void onGetStartRequest(String url, Class clas);
void onPostStartRequestBody(String url, Map<String, Object> body, Class clas);
void onDeleteStartRequest(String url, Class clas);
void onPutStartRequest(String url, Map<String, String> map, Class clas);
void imgList(String url,List<Object> list, Class clas);
void imgPath(String url,String path, Class clas);
}
PresenterImpl
public class PresenterImpl implements Presenter {
private ModelImpl model;
private ViewI viewI;
public PresenterImpl(ViewI viewI) {
this.viewI = viewI;
model = new ModelImpl();
}
@Override
public void onGetStartRequest(String url, Class clas) {
model.onGetSetData(url, clas, new CallBack() {
@Override
public void success(Object data) {
viewI.success(data);
}
@Override
public void error(Object error) {
viewI.error(error);
}
});
}
@Override
public void onPostStartRequestBody(String url, Map<String, Object> body, Class clas) {
model.onPostSetDataBody(url, body, clas, new CallBack() {
@Override
public void success(Object data) {
viewI.success(data);
}
@Override
public void error(Object error) {
viewI.error(error);
}
});
}
@Override
public void onDeleteStartRequest(String url, Class clas) {
model.onGetSetData(url, clas, new CallBack() {
@Override
public void success(Object data) {
viewI.success(data);
}
@Override
public void error(Object error) {
viewI.error(error);
}
});
}
@Override
public void onPutStartRequest(String url, Map<String, String> map, Class clas) {
model.onPutSetData(url, map, clas, new CallBack() {
@Override
public void success(Object data) {
viewI.success(data);
}
@Override
public void error(Object error) {
viewI.error(error);
}
});
}
@Override
public void imgList(String url, List<Object> list, Class clas) {
model.imgList(url, list, clas, new CallBack() {
@Override
public void success(Object data) {
viewI.success(data);
}
@Override
public void error(Object error) {
viewI.error(error);
}
});
}
@Override
public void imgPath(String url, String path, Class clas) {
model.imgPath(url, path, clas, new CallBack() {
@Override
public void success(Object data) {
viewI.success(data);
}
@Override
public void error(Object error) {
viewI.error(error);
}
});
}
public void setDestory() {
if (model != null) {
model = null;
}
if (viewI != null) {
viewI = null;
}
}
}
RetrofitManager
public class RetrofitManager<T> {
private final ApiService apiService;
public RetrofitManager() {
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.readTimeout(20, TimeUnit.SECONDS)
.writeTimeout(20, TimeUnit.SECONDS)
.connectTimeout(20, TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
/*添加cookie示例, 没有需要就不写,有需要看这篇文章 https://blog.youkuaiyun.com/ZHUHUOHUO/article/details/112761959
.addInterceptor(new AddCookiesInterceptor())//非首次登录直接拿出来用
.addInterceptor(new ReceivedCookiesInterceptor())//首次登录成功保存到本地*/
/* 添加请求头示例 没有需要就不写,有需要就写上
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
//拿到请求
Request request=chain.request();
//取出数据
SharedPreferences sharedPreferences=App.getApplication().getSharedPreferences("login",Context.MODE_PRIVATE);
String userId = sharedPreferences.getString("userId", "");
String sessionId= sharedPreferences.getString("sessionId", "");
Request.Builder builder1=request.newBuilder();
builder1.method(request.method(),request.body());
//添加
if (!TextUtils.isEmpty(userId)&&!TextUtils.isEmpty(sessionId)){
builder1.addHeader("userId",userId);
builder1.addHeader("sessionId",sessionId);
}
Request reques=builder1.build();
return chain.proceed(reques);
}
})*/
.build();
Retrofit retrofit = new Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(ApiConstant.BASE_URL)
.client(okHttpClient)
.build();
apiService = retrofit.create(ApiService.class);
}
public static RetrofitManager getInstence() {
return RetrofitHodler.retrofitManager;
}
private static class RetrofitHodler {
static RetrofitManager retrofitManager = new RetrofitManager();
}
//get请求
public void get(String url, HttpListener httplistener) {
apiService.get(url)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getObserver(httplistener));
}
public void delete(String url, HttpListener listener) {
apiService.get(url)
//后台执行在哪个线程中
.subscribeOn(Schedulers.io())
//最终完成后执行在哪个线程
.observeOn(AndroidSchedulers.mainThread())
//设置我们的rxJava
.subscribe(getObserver(listener));
}
//post请求
public void post(String url, Map<String, Object> map, HttpListener listener) {
if (map == null) {
map = new HashMap<>();
}
apiService.post(url, map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getObserver(listener));
}
//put请求
public void put(String url, Map<String, String> map, HttpListener listener) {
if (map == null) {
map = new HashMap<>();
}
apiService.put(url, map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getObserver(listener));
}
// 上传图片
public void imageList(String url, List<Object> list, HttpListener listener) {
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
builder.addFormDataPart("fileType", "images");
if (list.size() == 1) {
for (int i = 0; i < list.size(); i++) {
File file = new File((String) list.get(i));
builder.addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("images/jpg"), file));
}
}
apiService.Image(url, builder.build()).subscribeOn(Schedulers.io())
//在主线程调用
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getObserver(listener));
}
// 多图+视频 上传
public void imagePath(String url, String path, HttpListener listener) {
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
File file = new File((String) path);
if(path.contains("mp4")){
builder.addFormDataPart("fileType", "videos");
builder.addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("video/*"), file));
}else{
builder.addFormDataPart("fileType", "images");
builder.addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("images/*"), file));
}
apiService.Image(url, builder.build()).subscribeOn(Schedulers.io())
//在主线程调用
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getObserver(listener));
}
public interface HttpListener {
void onSuccess(String data);
void onFail(String error);
}
private Observer<ResponseBody> getObserver(HttpListener httpListener) {
Observer<ResponseBody> observer = new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResponseBody responseBody) {
try {
String data = responseBody.string();
if (httpListener != null) {
httpListener.onSuccess(data);
}
} catch (IOException e) {
e.printStackTrace();
if (httpListener != null) {
httpListener.onSuccess(e.getMessage());
}
}
}
@Override
public void onError(Throwable e) {
if (httpListener != null) {
httpListener.onFail(e.getMessage());
}
}
@Override
public void onComplete() {
}
};
return observer;
}
public static Map<String, Object> getFileMap() {
HashMap<String, Object> map = new HashMap<>();
map.put("channel", "android");
return map;
}
}