這個架構還是挺好用的,不過我技術比較渣,隻能封裝成這樣了,望大牛指點。
1.添加類庫
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.okhttp3:logging-interceptor:3.6.0'
2. RetrofitHelper類簡單封裝
package com.zlc.rxmvp.http;
import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import com.ssdk.dongkang.App;
import com.ssdk.dongkang.utils.LogUtil;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import okhttp3.Cache;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* Created by zlc
* Retrofit幫助類
*/
public class RetrofitHelper {
//設定緩存目錄
private static File cacheFile;
private static long maxSize = * * ; //緩存檔案大小
private final static long TIMEOUT = ; //逾時時間
private Cache mCache;
private final static String baseUrl = HttpUrl.DOMAIN;
private OkHttpClient mClient;
private Retrofit mRetrofit;
private final HttpService mHttpService;
private static String TAG;
private RetrofitHelper(){
cacheFile = new File(App.getContext().getCacheDir().getAbsolutePath(), "dk_cache");
if(!cacheFile.exists()){
cacheFile.mkdir();
}
TAG = this.getClass().getSimpleName();
mHttpService = getRetrofit().create(HttpService.class);
}
//單例 保證對象唯一
public static RetrofitHelper getInstance(){
return SingletonHolder.retrofitHelper;
}
private static class SingletonHolder{
private final static RetrofitHelper retrofitHelper = new RetrofitHelper();
}
//建立緩存檔案和目錄
private Cache getCache(){
if(mCache ==null)
mCache = new Cache(cacheFile, maxSize);
return mCache;
}
//擷取OkHttpClient
private OkHttpClient getOkHttpClient(){
if(mClient ==null) {
mClient = new OkHttpClient.Builder()
.connectTimeout(TIMEOUT, TimeUnit.SECONDS)
.readTimeout(TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(TIMEOUT, TimeUnit.SECONDS)
//.addInterceptor(headInterceptor)
.addInterceptor(loggingInterceptor)
.cache(getCache()) //設定緩存
.build();
}
return mClient;
}
//擷取Retrofit對象
public Retrofit getRetrofit(){
if(mRetrofit==null) {
mRetrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create()) //添加Gson支援
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) //添加RxJava支援
.client(getOkHttpClient()) //關聯okhttp
.build();
}
return mRetrofit;
}
//擷取服務對象
public static synchronized HttpService getService(){
return RetrofitHelper.getInstance().mHttpService;
}
//日志攔截器
private final static Interceptor headInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request mRequest=chain.request();
//在這裡你可以做一些想做的事,比如token失效時,重新擷取token
//或者添加header等等
return chain.proceed(mRequest);
}
};
//日志攔截器
private final static HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
LogUtil.e(TAG + " : log",message);
}
}).setLevel(HttpLoggingInterceptor.Level.BODY);
}
3. HttpService類簡寫
public interface HttpService{
@FormUrlEncoded
@POST("checkhardWare.htm")
Observable<BaseInfo<LastTimeInfo>> checkHardWare(@FieldMap Map<String,String> map);
}
4. HttpUtils類簡單封裝
package com.zlc.rxmvp.http;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;
import com.ssdk.dongkang.App;
import com.ssdk.dongkang.utils.LogUtil;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
/**
* Created by zlc
* 網絡請求工具類
*/
public class HttpUtil {
//Post方式請求網絡
public static void post(Observable observable, final OnResultListener resultListener){
setSubscriber(observable, new Observer() {
Disposable d;
@Override
public void onSubscribe(Disposable d) {
LogUtil.e("onSubscribe",d+"");
this.d = d;
}
@Override
public void onNext(Object value) {
LogUtil.e("onNext",value+"");
if(value == null){
LogUtil.e("onNext ","JSON解析失敗");
}else if(resultListener!=null){
resultListener.onSuccess(value);
}
}
@Override
public void onError(Throwable error) {
errorDispose(error, resultListener);
if(d != null)
d.dispose();
}
@Override
public void onComplete() {
LogUtil.e("onComplete","請求完成");
if(d != null)
d.dispose();
}
});
}
//Get方式請求網絡
public static void get(Observable observable, final OnResultListener resultListener){
post(observable,resultListener);
}
//訂閱事件
public static<T> void setSubscriber(Observable<T> observable, Observer<T> observer){
observable.subscribeOn(Schedulers.newThread()) //開啟新線程
.observeOn(AndroidSchedulers.mainThread()) //ui操作放主線程
.subscribe(observer);
}
//接口回調
public interface OnResultListener<T>{
void onSuccess(T t);
void onError(Throwable error, String msg);
}
//錯誤處理
private static void errorDispose(Throwable error, OnResultListener resultListener) {
if(error!=null && resultListener!=null){
resultListener.onError(error,error.getMessage());
}else if(resultListener!=null){
resultListener.onError(new Exception("網絡不給力"),"");
Toast.makeText(App.getContext(),"網絡不給力",Toast.LENGTH_LONG).show();
return;
}
String e = error.getMessage();
int code =;
if(!TextUtils.isEmpty(e)){
try {
e = e.substring(e.length()-,e.length());
code = Integer.valueOf(e);
}catch (Exception e1){
Toast.makeText(App.getContext(),"網絡不給力",Toast.LENGTH_LONG).show();
}
}
Log.e("錯誤code",code+"");
if(code>=&&code<){
Toast.makeText(App.getContext(),"您的請求迷路了,請稍後再試",Toast.LENGTH_LONG).show();
}else if(code>=){
Toast.makeText(App.getContext(),"伺服器異常,請稍後再試",Toast.LENGTH_LONG).show();
}else{
Toast.makeText(App.getContext(),"網絡不給力",Toast.LENGTH_LONG).show();
}
}
}
5. mvp presenter封裝
package com.zlc.rxmvp.mvp;
/**
* Created by zlc on
*/
public interface BaseIPresenter{
//銷毀View
void onDestoryView();
}
package com.ssdk.dongkang.mvp;
import android.content.Context;
import com.ssdk.dongkang.http.HttpService;
import com.ssdk.dongkang.http.RetrofitHelper;
/**
* Created by zlc on
* 所有Presenter層的父類
*/
public abstract class BasePresenter <T extends BaseIView> implements BaseIPresenter{
protected T mView;
protected Context mContext;
protected final HttpService mHttpService;
public BasePresenter(T view,Context context){
this.mView = view;
this.mContext = context;
mHttpService = RetrofitHelper.getService();
}
//請求網絡 加載資料方法
protected abstract void initData();
//擷取HttpService對象
public HttpService getService() {
return mHttpService;
}
@Override
public void onDestoryView() {
if(mView !=null)
mView = null;
}
}
6. mvp view封裝
package com.zlc.rxmvp.mvp;
/**
* Created by zlc on
* 所有View層的父類 隻是為了一個通用
*/
public interface BaseIView {
//資料請求失敗 View層處理
void onError();
}
7.聯系方式
qq:@qq.com
email : [email protected]
phone :
8.下載下傳位址
點選去下載下傳