导入依赖
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.1.7'
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-scalars:2.0.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
清单文件中加入权限
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:name=".IApplication"
先写公共基类BasePresenter<V>
//V泛指所有view层接口的类型
public class BasePresenter<V> {
public V view;//相当于View层的接口
/**
*presenter绑定,持有view 的接口
* */
public void attach(V v){
this.view = v;
}
/**
* presenter释放持有view层的接口,防止内存泄漏
* */
public void detach(){
this.view = null;
}
}
写一个公共的BaseMvpActivity<V,T extends BasePresenter<V>> extends AppcompatActivity
public abstract class BaseMvpActivity<V,T extends BasePresenter<V>> extends AppCompatActivity {
public T presenter;//presenter
public abstract T initPresenter();//返回值是T 代表presenter层的类型
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base_mvp);
presenter = initPresenter();
}
@Override
protected void onResume() {
super.onResume();
//绑定,p和v层
presenter.attach((V) this);
}
@Override
protected void onDestroy() {
super.onDestroy();
//解除p层和v层的绑定
presenter.detach();
}
}
view层的接口LoginView,model层的接口LoginModelCallBack
public interface LoginView {
public void success(Bean bean);
public void failure();
}
public interface LoginModelCallBack {
public void success(Bean bean);
}
具体的presenter类LoginPresenter继承BasePresenter<LoginView>
public class LoginPresenter extends BasePresenter<LoginView> {
LoginModelImpl loginModel;
public LoginPresenter(){
this.loginModel = new LoginModelImpl();
}
//presenter里面的方法
public void login(){
loginModel.getData(new LoginModelCallBack() {
@Override
public void success(Bean bean) {
//view就是此时的view层接口
view.success(bean);
}
});
}
}
具体的model层LoginModelImpl
public class LoginModelImpl {
public void getData(final LoginModelCallBack modelCallBack){
//http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10
Map<String,String> map = new HashMap<>();
map.put("key","71e58b5b2f930eaf1f937407acde08fe");
map.put("num","10");
//调用application中初始化过的方法
Observable<Bean> observable = IApplication.iInterface.get(map);
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Bean>() {
@Override
public void accept(Bean bean) throws Exception {
//拿到了请求回来的数据
//回调出去
modelCallBack.success(bean);
}
});
}
}
具体的view层MainActivity
//继承自己写的基类,泛型为<view层接口,和presenter层> 实现view层接口
public class MainActivity extends BaseMvpActivity<LoginView,LoginPresenter> implements LoginView{
//继承抽象类BaseMvpActivity ,必须重写的方法initPresenter
@Override
public LoginPresenter initPresenter() {
return new LoginPresenter();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//此时的presenter就是loginpresenter
presenter.login();//调用p层的方法
}
});
}
//实现view层接口 重写的方法
@Override
public void success(Bean bean) {
System.out.println("ok" + bean.toString());
}
@Override
public void failure() {
}
}
retrofit访问网络的接口类IInterface
public interface IInterface {
@GET("/nba")
Observable<Bean> get(@QueryMap Map<String,String> map);
@POST("/nba")
Observable<Bean> post(@FieldMap Map<String,String> map);
}
IApplication类中初始化retrofit
public class IApplication extends Application{
public static IInterface iInterface;
@Override
public void onCreate() {
super.onCreate();
//http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.tianapi.com")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
iInterface = retrofit.create(IInterface.class);
}
}