1.BaseApis接口封装请求方式
package com.example.wdshop.network;
import java.util.Map;
import okhttp3.ResponseBody;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.PartMap;
import retrofit2.http.QueryMap;
import retrofit2.http.Url;
import rx.Observable;
public interface BaseApis {
/**
* Observable被观察者
* */
@GET
Observable get(@Url String url);
@POST
Observable post(@Url String url, @QueryMap Map map);
@Multipart
@POST
Observable postFormBody(@Url String url, @PartMap Map requestBodyMap);
}
2.RetrofitManager工具类
package com.example.wdshop.network;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import rx.Observer;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class RetrofitManager {
private final String BASE_URL = "http://172.17.8.100/small/";
private static RetrofitManager instance;
private final BaseApis baseApis;
//单例
public static RetrofitManager getInstance() {
if (instance == null) {
synchronized (RetrofitManager.class) {
instance = new RetrofitManager();
}
}
return instance;
}
//无参构造
public RetrofitManager() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.readTimeout(10, TimeUnit.SECONDS);
builder.writeTimeout(10, TimeUnit.SECONDS);
builder.connectTimeout(10, TimeUnit.SECONDS);
builder.addInterceptor(interceptor);
builder.retryOnConnectionFailure(true);
OkHttpClient build = builder.build();
Retrofit retrofit = new Retrofit.Builder()
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.baseUrl(BASE_URL)
.client(build)
.build();
baseApis = retrofit.create(BaseApis.class);
}
/**
* 可以这样生成Map requestBodyMap
* Map requestDataMap这里面放置上传数据的键值对。
*/
public Map generateRequestBody(Map requesrDataMap) {
Map requestBodyMap = new HashMap<>();
for (String key : requesrDataMap.keySet()) {
RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"),
requesrDataMap.get(key) == null ? "" : requesrDataMap.get(key));
requestBodyMap.put(key, requestBody);
}
return requestBodyMap;
}
/**
* get
*/
public RetrofitManager get(String url,HttpListener listener) {
baseApis.get(url)
//后台执行在哪个线程
.subscribeOn(Schedulers.io())
//最终完成后执行在哪个线程
.observeOn(AndroidSchedulers.mainThread())
//设置rxjava
.subscribe(getObserver(listener));
return instance;
}
/**
* 观察者
*/
private Observer getObserver(final HttpListener listener) {
Observer observer = new Observer() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
if (listener != null) {
listener.onFail(e.getMessage());
}
}
@Override
public void onNext(ResponseBody responseBody) {
try {
String data = responseBody.string();
if (null != listener) {
listener.onSuccess(data);
}
} catch (IOException e) {
e.printStackTrace();
if (listener != null) {
listener.onFail(e.getMessage());
}
}
}
};
return observer;
}
/**
* 表单post请求
*/
public RetrofitManager postFormBody(String url, Map map,HttpListener listener) {
if (map == null) {
map = new HashMap<>();
}
baseApis.postFormBody(url,map)
//后台执行在哪个线程
.subscribeOn(Schedulers.io())
//最终完成后执行在哪个线程
.observeOn(AndroidSchedulers.mainThread())
//设置rxjava
.subscribe(getObserver(listener));
return instance;
}
/**
* 普通post
* */
public RetrofitManager post(String url,Map map,HttpListener listener){
if(map == null){
map = new HashMap<>();
}
baseApis.post(url,map)
// 后台执行在哪个线程
.subscribeOn(Schedulers.io())
//最终完成后执行在哪个线程
.observeOn(AndroidSchedulers.mainThread())
//设置rxjava
.subscribe(getObserver(listener));
return instance;
}
//创建观察者
public interface HttpListener {
void onSuccess(String data);
void onFail(String error);
}
}
3.view层接口
package com.example.wdshop.view;
public interface Iview {
void requestData(E e);
void requestFail(E e);
}
4.presenter层接口
package com.example.wdshop.presents;
import java.util.Map;
public interface Ipresenter {
//post请求
void startRequest(String url, Map map, Class clazz);
//get请求
void getRequest(String url,Class clazz);
}
5.p层实现类
package com.example.wdshop.presents;
import com.example.wdshop.model.ModelImpl;
import com.example.wdshop.model.MyCallBack;
import com.example.wdshop.view.Iview;
import java.util.Map;
public class PresenterImpl implements Ipresenter {
private Iview mIview;
private ModelImpl model;
public PresenterImpl(Iview iview) {
mIview = iview;
model = new ModelImpl();
}
/**
* post
* */
@Override
public void startRequest(String url, Map map, Class clazz) {
model.requestData(url, map, clazz, new MyCallBack() {
@Override
public void onSuccess(Object data) {
mIview.requestData(data);
}
@Override
public void onFail(String error) {
mIview.requestFail(error);
}
});
}
/**
* get
* */
@Override
public void getRequest(String url, Class clazz) {
model.requestGet(url, clazz, new MyCallBack() {
@Override
public void onSuccess(Object data) {
mIview.requestData(data);
}
@Override
public void onFail(String error) {
mIview.requestFail(error);
}
});
}
public void onDetach(){
if (model!=null){
model = null;
}
if(mIview!=null){
mIview = null;
}
}
}
6.MyCallBack接口用于从m层向v层传数据
package com.example.wdshop.model;
public interface MyCallBack {
void onSuccess(E data);
void onFail(String error);
}
7.m层接口
package com.example.wdshop.model;
import java.util.Map;
public interface Imodel {
/**
* post
* */
void requestData(String url, Map map, Class clazz, MyCallBack myCallBack);
/**
* get
* */
void requestGet(String url,Class clazz, MyCallBack myCallBack);
}
8.m层实现类
package com.example.wdshop.model;
import com.example.wdshop.network.RetrofitManager;
import com.google.gson.Gson;
import java.util.Map;
public class ModelImpl implements Imodel {
private MyCallBack myCallBack;
/**
* post
* */
@Override
public void requestData(String url, final Map map, final Class clazz, final MyCallBack myCallBack) {
this.myCallBack = myCallBack;
RetrofitManager.getInstance().post(url,map,new RetrofitManager.HttpListener() {
@Override
public void onSuccess(String data) {
try {
Object o = new Gson().fromJson(data, clazz);
if(myCallBack!=null){
myCallBack.onSuccess(o);
}
}catch (Exception e){
e.printStackTrace();
if(myCallBack!=null){
myCallBack.onFail(e.getMessage());
}
}
}
@Override
public void onFail(String error) {
if(myCallBack!=null){
myCallBack.onFail(error);
}
}
});
}
/**
* get
* */
@Override
public void requestGet(String url, final Class clazz, final MyCallBack myCallBack) {
RetrofitManager.getInstance().get(url,new RetrofitManager.HttpListener() {
@Override
public void onSuccess(String data) {
try {
Object o = new Gson().fromJson(data, clazz);
if(myCallBack!=null){
myCallBack.onSuccess(o);
}
}catch (Exception e){
e.printStackTrace();
if(myCallBack!=null){
myCallBack.onFail(e.getMessage());
}
}
}
@Override
public void onFail(String error) {
if(myCallBack!=null){
myCallBack.onFail(error);
}
}
});
}
}