欲练此功,必先了解以下内容:
retrofit2 https://blog.csdn.net/lmj623565791/article/details/51304204
rxjava https://blog.csdn.net/guodashen007/article/details/103349632
再来说MVP: 全称:Model-View-Presenter ;MVP 是从经典的模式 MVC 演变而来,它们的基本思想有相通的地方:Controller/Presenter 负责逻辑的处理,Model 提供数据,View 负责显示。
当 View 需要更新时,首先去找 Presenter ,然后 Presenter 找 Model 获取数据,Model 获取到数据之后直接更新 View。
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
网络访问,聚合接口,机器人自动回复
public interface Api {
@GET("robot/index?info=你好&key=096e85b6bde6fc56b74d8b64066af33c")
Observable<BaseRespons<Result>> getData();
}
首先定义一个 Contract 契约接口,然后把 Model、View、和 Presenter 的子类分别放入 Contract 的内部,这里的一个 Contract 就对应一个页面(一个 Activity 或者一个 Fragment),放在 Contract 内部是为了让同一个页面的逻辑方法都放在一起,方便查看和修改。Presenter 中的 request3 方法演示了如何通过 Presenter 来进行 View 和 Model 的交互。
接下来要做的就是实现这三个模块的逻辑方法了,在 Activity 或 Fragment 中实现 MainContract .View 的接口,再分别创建两个类用来实现 MainContract .Model 和 MainContract .Presenter,复写里面的抽象方法就好了。
public interface MainContract {
interface Model{
Observable<Result> getData();
}
interface View{
void getDataSuccess(Result mResult);
}
interface Presenter{
void getData();
}
}
public class MainModel implements MainContract.Model{
//构建Retrofit实例
Retrofit retrofit = new Retrofit.Builder()
//设置网络请求BaseUrl地址
.baseUrl("http://op.juhe.cn/")
//设置数据解析器
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
@Override
public Observable<Result> getData() {
return retrofit.create(Api.class).getData().compose(this.<Result>handleResult());
}
public <T> ObservableTransformer<BaseRespons<T>, T> handleResult() {
return new ObservableTransformer<BaseRespons<T>, T>() {
@Override
public ObservableSource<T> apply(Observable<BaseRespons<T>> tObservable) {
return tObservable.flatMap(
new Function<BaseRespons<T>, Observable<T>>() {
@Override
public Observable<T> apply(BaseRespons<T> tResponseData) throws Exception {
//可以相应更改
return Observable.just(tResponseData.getResult());
}
}
);
}
};
}
}
public class MainPresenter implements MainContract.Presenter{
private MainContract.View view;
private MainModel model;
public MainPresenter(MainContract.View view) {
this.view = view;
this.model=new MainModel();
}
@Override
public void getData() {
model.getData().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Result>(){
@Override
public void onSubscribe(Disposable d) {
Log.i("MainPresenter", "onSubscribe: ");
}
@Override
public void onNext(Result resultBaseRespons) {
view.getDataSuccess(resultBaseRespons);
}
@Override
public void onError(Throwable e) {
Log.i("MainPresenter", e.toString());
}
@Override
public void onComplete() {
Log.i("MainPresenter", "onComplete");
}
});
}
}
在MainActivity中使用
public class MainActivity extends AppCompatActivity implements MainContract.View{
private MainPresenter Presenter;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=findViewById(R.id.textView);
Presenter=new MainPresenter(this);
Presenter.getData();
}
@Override
public void getDataSuccess(Result mResult) {
Log.i("getDataSuccess", mResult.toString());
textView.setText(mResult.toString());
}
}
demo地址:https://download.csdn.net/download/guodashen007/11996862