您的位置:首页 > 编程语言 > Java开发

MVP封装成基类结合retrofit和Rxjava

2017-12-06 12:16 423 查看
导入依赖

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'


[b]清单文件中加入权限[/b]



<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<application
android:name=".utlis.IApplication"

先写公共基类BasePresenter<V>



package com.example.snmsung.retrofitmvp.utlis;

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



package com.example.snmsung.retrofitmvp.activity;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;

import com.example.snmsung.retrofitmvp.R;
import com.example.snmsung.retrofitmvp.utlis.BasePresenter;

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



package com.example.snmsung.retrofitmvp.view;

import com.example.snmsung.retrofitmvp.Bean.Bean;

/**
* Created by SNMSUNG on 2017/12/6.
*/

public interface LoginView {
public void success(Bean bean);
public void failure();
}

package com.example.snmsung.retrofitmvp.moder;

import com.example.snmsung.retrofitmvp.Bean.Bean;

/**
* Created by SNMSUNG on 2017/12/6.
*/

public interface LoginModelCallBack {
public void success(Bean bean);
}

具体的presenter类LoginPresenter继承BasePresenter<LoginView>

package com.example.snmsung.retrofitmvp.presenter;

import com.example.snmsung.retrofitmvp.Bean.Bean;
import com.example.snmsung.retrofitmvp.moder.LoginModelCallBack;
import com.example.snmsung.retrofitmvp.moder.LoginModelImpl;
import com.example.snmsung.retrofitmvp.utlis.BasePresenter;
import com.example.snmsung.retrofitmvp.view.LoginView;

/**
* Created by SNMSUNG on 2017/12/6.
*/

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



package com.example.snmsung.retrofitmvp.moder;
import com.example.snmsung.retrofitmvp.Bean.Bean;
import com.example.snmsung.retrofitmvp.utlis.IApplication;

import java.util.HashMap;
import java.util.Map;

import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;

/**
* Created by SNMSUNG on 2017/12/6.
*/

public class LoginModelImpl {
public void getData(final LoginModelCallBack modelCallBack) {
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



package com.example.snmsung.retrofitmvp.activity;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.example.snmsung.retrofitmvp.Bean.Bean;
import com.example.snmsung.retrofitmvp.R;
import com.example.snmsung.retrofitmvp.presenter.LoginPresenter;
import com.example.snmsung.retrofitmvp.view.LoginView;

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.but);
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

package com.example.snmsung.retrofitmvp.utlis;

import com.example.snmsung.retrofitmvp.Bean.Bean;

import java.util.Map;

import io.reactivex.Observable;
import retrofit2.http.FieldMap;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.QueryMap;

/**
* Created by SNMSUNG on 2017/12/6.
*/

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

package com.example.snmsung.retrofitmvp.utlis;

import android.app.Application;

import retrofit2.Retrofit;

import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

/**
* Created by SNMSUNG on 2017/12/5.
*/

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);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: