MVP封装成基类结合retrofit和Rxjava

来源:互联网 发布:辐射4低配优化补丁 编辑:程序博客网 时间:2024/05/16 04:45

导入依赖

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"></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();        //绑定,pv        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);    }}

原创粉丝点击