MVP重新封装(retrofit+Rxjava请求数据)

当下,Rxjava + Retrofit + MVP是Android开发最流行,使用最多的框架了,替代了原来的OKhttp + MVC的模式,但是好处在哪呢。其实Retrofit是在Okhttp的基础上发展而来的网络请求框架,区别不是很大,但是跟RxAndroid配合使用就能发挥其威力了。

1、首先导入依赖

//rxjava依赖
implementation 'io.reactivex.rxjava2:rxjava:2.2.4'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
//retrofit依赖
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
//okhttp依赖
implementation 'com.squareup.okhttp3:okhttp:3.12.1'
//okhttp日志拦截器
implementation 'com.squareup.okhttp3:logging-interceptor:3.12.1'
//butterknife注解依赖
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

Activity代码

public class MainActivity extends AppCompatActivity {

@BindView(R.id.textView)
TextView textView;
TextPresenter textPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);//绑定

    //创建p层
    textPresenter = new TextPresenter(new TextCall());


    //发送请求
    textPresenter.request();
}


class TextCall implements DataCall<Result<List<BannerData>>>{

    @Override
    public void success(Result<List<BannerData>> data) {
        List<BannerData> dataData = data.getData();

        textView.setText(dataData.get(1).getTitle());
    }

    @Override
    public void fial(Throwable throwable) {
        Toast.makeText(MainActivity.this, "请求失败", Toast.LENGTH_SHORT).show();
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    textPresenter.unbind();//防止内存泄漏
}
}

IResult请求接口,代替了model层

public interface IResult{

@GET("ad/getAd")//加入接口中需要改变的部分
Observable<Result<List<BannerData>>>  banner();
}

BasePresenter

public abstract class BasePresenter {
DataCall dataCall;

public BasePresenter(DataCall dataCall) {
    this.dataCall = dataCall;
}


public abstract Observable observable(Object...args);


public void request(Object...args){
    observable(args).subscribeOn(Schedulers.newThread())   //将请求调度到子线程
            .observeOn(AndroidSchedulers.mainThread())    //将结果调度到主线程
            .subscribe(new Consumer<Result>() {

                @Override
                public void accept(Result result) throws Exception {
                    dataCall.success(result);
                }
            }, new Consumer<Throwable>() {
                @Override
                public void accept(Throwable throwable) throws Exception {
                    dataCall.fial(throwable);
                }
            });
}
public void unbind(){
    dataCall = null;
}

}

presenter继承Basepresenter

public class TextPresenter extends BasePresenter{

public TextPresenter(DataCall dataCall) {
    super(dataCall);
}

@Override
public Observable observable(Object... args) {

    IResult iResult = NetWork.getInstance().create(IResult.class);
    return iResult.banner();
}
}

工具类

public class NetWork {

private String base_url = "http://www.zhaoapi.cn/";//必须以"/"结尾
public static NetWork instance;
private Retrofit retrofit;

public static NetWork getInstance(){

    if (instance == null) {
        instance = new NetWork();
    }

    return instance;
}
//设置成私有属性
private NetWork() {
    init();
}

private void init() {
    //创建日志拦截器
    HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
    httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    //okhttp
    OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .addInterceptor(httpLoggingInterceptor)
            .writeTimeout(30, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .connectTimeout(60, TimeUnit.SECONDS)
            .build();

    //retrofit+RxJava
    retrofit = new Retrofit.Builder()
            .baseUrl(base_url)
            .client(okHttpClient)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create())
            .build();


}

public <T> T create(final Class<T> service) {
    return retrofit.create(service);
}
}

View层

public interface DataCall<T> {
void success(T data);
void fial(Throwable throwable);
}

猜你喜欢

转载自blog.csdn.net/qq_43567217/article/details/86132989