一竹握,在APP的gradle下添加相關(guān)的依賴
//retrofit
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.11.0'
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
//rx
implementation 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'io.reactivex.rxjava2:rxjava:2.2.6'
上述gradle包含了Gson自動(dòng)轉(zhuǎn)換画株,rxjava ,okhttp等封裝所需依賴
二,需要封裝一個(gè)NetManager的管理類啦辐,此類在項(xiàng)目初始化的地方進(jìn)行初始化谓传,調(diào)用NetManager.init();
// private static String url = "http://eyetrain.holosz.com/";
private static String url = "此處填寫你的api的接口地址";
private static Retrofit mRetrofit;
public static void init() {
Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create(JsonUtil.GSON))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(getDefaultClient());
mRetrofit = builder.build();
}
/**
* 獲取相應(yīng)的服務(wù)
*
* @param service
* @param <T>
* @return
*/
public static <T> T getService(Class<T> service) {
return mRetrofit.create(service);
}
private static OkHttpClient getDefaultClient() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
HttpLoggingInterceptor.Level level = HttpLoggingInterceptor.Level.BODY;
interceptor.setLevel(level);
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.connectTimeout(10000, TimeUnit.MILLISECONDS)
.readTimeout(10000, TimeUnit.MILLISECONDS)
.writeTimeout(10000, TimeUnit.MILLISECONDS)
.addInterceptor(interceptor)
.followRedirects(false)
.retryOnConnectionFailure(true)
.followSslRedirects(false);
try {
final TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
return builder.build();
} catch (Exception e) {
e.printStackTrace();
}
return builder.build();
}
}
三,需要封裝一個(gè)NetHelper工具類芹关,用于對(duì)網(wǎng)絡(luò)情況進(jìn)行判斷
public class NetHelper {
public static boolean isNetworkConnected() {
ConnectivityManager mConnectivityManager = (ConnectivityManager) UIUtils.getContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
if (mNetworkInfo != null) {
return mNetworkInfo.isAvailable();
}
return false;
}
public @interface RiskType {
}
/**
* 沒有連接網(wǎng)絡(luò)
*/
public static final int NETWORK_NONE = -1;
/**
* 移動(dòng)網(wǎng)絡(luò)
*/
public static final int NETWORK_MOBILE = 0;
/**
* 無線網(wǎng)絡(luò)
*/
public static final int NETWORK_WIFI = 1;
public static int getNetWorkState(Context context) {
// 得到連接管理器對(duì)象
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager
.getActiveNetworkInfo();
if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_WIFI)) {
return NETWORK_WIFI;
} else if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_MOBILE)) {
return NETWORK_MOBILE;
}
} else {
return NETWORK_NONE;
}
return NETWORK_NONE;
}
}
四续挟、接下來就開始編寫你的Rx相關(guān)部分
public class BaseApi {
protected static Disposable subscribeOnUiThread(Observable observable, final OnHttpFinishListener listener) {
if (!NetHelper.isNetworkConnected()) {
ToastUtil.showShortTimeMsg("請(qǐng)檢查網(wǎng)絡(luò)設(shè)置");
listener.onFail("請(qǐng)檢查網(wǎng)絡(luò)設(shè)置");
return null;
}
return observable
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.map(new HttpResultFunc())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new HttpSuccessSubscriber(listener), new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
listener.onFail(throwable.getMessage());
}
});
}
protected static Disposable subscribeOnUiThread1(Observable observable, final OnHttpFinishListener listener) {
if (!NetHelper.isNetworkConnected()) {
ToastUtil.showShortTimeMsg("請(qǐng)檢查網(wǎng)絡(luò)設(shè)置");
listener.onFail("請(qǐng)檢查網(wǎng)絡(luò)設(shè)置");
return null;
}
return observable
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.map(new HttpResultFunc1())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new HttpSuccessSubscriber(listener), new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
listener.onFail(throwable.getMessage());
}
});
}
}
五,封裝你的retrofit相關(guān)接口(service)以及獲取service的工具類
/**
* @author tyson_wu
* @date 2020/3/1
* @description:
*/
public interface ChildrenService {
@POST("addChildren")
Observable<HttpResp<Children>> uploadChildren(@Body Children children);
@POST("updateChildrenData")
Observable<HttpResp<Children>> updateChildren(@Body Children children);
@POST("getVisionData")
Observable<HttpResp<List<VisionData>>> getVisionData(@Body GetVisionDataReq req);
@POST("commitVisionData")
Observable<HttpResp> commitVisionData(@Body VisionData req);
}
/**
* @author tyson_wu
* @date 2020/1/10
* @description : 用于獲取服務(wù)類
*/
public class Service {
public static UserDataService getUserDataService() {
return NetManager.getService(UserDataService.class);
}
public static OtherService getOtherService() {
return NetManager.getService(OtherService.class);
}
public static ChildrenService getChildrenService() {
return NetManager.getService(ChildrenService.class);
}
}
六侥衬,封裝你的各個(gè)presenter的api
public class LoginApi extends BaseApi {
/**
* 電話號(hào)碼登錄
*
* @param req
* @param listener
*/
public static void phoneLogin(LoginReq req, OnHttpFinishListener<User> listener) {
subscribeOnUiThread(Service.getUserDataService().login(req), listener);
}
/**
* 用戶注冊(cè)
*
* @param req
* @param listener
*/
public static void register(RegisterReq req, OnHttpFinishListener<User> listener) {
subscribeOnUiThread(Service.getUserDataService().register(req), listener);
}
/**
* 找回密碼
* @param req
* @param listener
*/
public static void forgotPassword(RegisterReq req, OnHttpFinishListener<User> listener) {
subscribeOnUiThread(Service.getUserDataService().forgotPassword(req), listener);
}
}
最后你就可以調(diào)用啦诗祸,在Presenter中進(jìn)行網(wǎng)絡(luò)調(diào)用,然后可以使用EventBus進(jìn)行通訊浇冰,也可以利用View中的接口讓Activity與Presenter進(jìn)行通訊