MVP+RxAndroid+Retrogit封裝的獲取網路
阿新 • • 發佈:2018-12-20
這次直接上程式碼:
程式碼目錄
搭建環境
/*RxJava與RxAndroid的依賴*/ implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' implementation 'io.reactivex.rxjava2:rxjava:2.1.0' /*Retrofit與RxAndroid配置依賴*/ implementation 'com.squareup.retrofit2:retrofit:2.3.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' /*使Retrofit的轉化器自定義完成資料的轉化 * 就是我們可以介面中少寫一些bean類 * */ implementation 'com.squareup.retrofit2:converter-scalars:+' /*gson解析*/ implementation 'com.google.code.gson:gson:2.8.1'
1.基類
/**
* Activity基類
* */
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
/** * date:2018/12/9 * author:輝(家輝輝輝) * function:P層基類 */ public abstract class BaseP<T> { public T view; //兩個方法,一個繫結,一個解除,解決記憶體洩漏 public void attach(T view){ this.view = view ; } //將P層物件直為空 public void detach(){ this.view = null; } }
/** * V:當前View * P:當前的Presenter * 提示:因為每個Activity建立的Pretender,view都不同所以定義泛型 * */ public abstract class BaseMVPActivity<V,T extends BaseP<V>> extends BaseActivity { public T presenter; public abstract T initPresenter(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); presenter = initPresenter(); } @Override protected void onResume() { super.onResume(); presenter.attach((V) this); } @Override protected void onDestroy() { super.onDestroy(); presenter.detach(); } }
有基類之後呢,去找人繼承
實際在Activity中使用
public class MainActivity extends BaseMVPActivity<V,P> {
@Override
public P initPresenter() {
return new P();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
presenter.getData();
}
}
P層也要繼承BaseP
public class P extends BaseP<V> {
private final M mM;
//建立Model
public P() {
mM = new M();
}
//A、Presenter和Model進行互動的操作
public void getData(){
//獲取m中的方法
mM.getData();
}
}
我們再看下m層
public class M {
/**
* 有的方法用不到,所以用介面卡的設計模式改變
* */
public void getData(){
}
}
**以上就是MVP的封裝
**以下開始Retrofit+RxJava的封裝
第一步寫介面,發現了沒有跟我們平常寫retrofit的時候不一樣因為我們加入了RxJava
/**
* date:2018/12/9
* author:輝(家輝輝輝)
* function:RxAndroid與Retrofit的結晶
*/
public interface ApiService {
/**
* Get的基本請求
* 從Call改為了被觀察者observable
* */
@GET
Observable<String> get(@Url String url);
/**
* Get請求提交表單
* 從Call改為了被觀察者observable
* */
@GET
Observable<String> get(@Url String url, @QueryMap Map<String,String> map);
/**
* Post請求提交表單
* 從Call改為了被觀察者observable
* */
@FormUrlEncoded
@POST
Observable<String> post(@Url String url, @FieldMap Map<String,String> map);
}
第二步寫網路工具類
public class RetrofitFactory {
//全域性只有一個okhttp物件
public static OkHttpClient sOkHttpClient = new OkHttpClient.Builder()
.connectTimeout(20,TimeUnit.SECONDS)
.readTimeout(20,TimeUnit.SECONDS)
.writeTimeout(20,TimeUnit.SECONDS)
.build();
public static ApiService mApiService = new Retrofit.Builder()
.baseUrl("http://172.17.8.100/small/user/v1/register/")//請求頭
//使我們能高度自定義轉化器
.addConverterFactory(ScalarsConverterFactory.create())//重要的三步.1
.client(sOkHttpClient)//重要的三步.2
//把 以前的 call 轉化成 Observable
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())//重要的三步.3
.build().create(ApiService.class);
public static Observable<String> get(String url){
return mApiService.get(url)
.subscribeOn(Schedulers.io())//被觀察者
.observeOn(AndroidSchedulers.mainThread());//觀察者
}
public static Observable<String> get(String url, Map<String,String> map){
return mApiService.get(url,map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public static Observable<String> post(String url,Map<String,String> map){
return mApiService.post(url,map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}
第三步使用,但是使用的時候我們會發現觀察者有4個方法我們只需要一個所以用一個介面卡設計模式改變下
//先寫個基類實現介面
/**
* date:2018/12/9
* author:輝(家輝輝輝)
* function:介面卡設計模式取我們需要的
*/
public abstract class BaseObserver implements Observer<String> {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
onSuccess(s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
public abstract void onSuccess(String str);
}
下面開始在M層使用,我把之前的註釋了,讓我們更清楚的看到了區別
public class M {
/**
* 有的方法用不到,所以用介面卡的設計模式改變
* */
public void getData(){
/* RetrofitFactory.get("").subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});*/
RetrofitFactory.get("").subscribe(new BaseObserver() {
@Override
public void onSuccess(String str) {
System.out.println(str +"");
}
});
}
}