MVP+Retrofit+RxJava 使用

用了这么久的MVP,今天也在此记录一下,好好学习,天天向上!!!感觉也没啥说的,看代码吧......

1、添加依赖

/*网络请求*/
    compile 'com.squareup.okio:okio:1.8.0'
    compile 'com.squareup.okhttp3:okhttp:3.2.0'
    compile 'com.google.code.gson:gson:2.2.4'
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
    compile 'io.reactivex:rxandroid:1.2.0'
    compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'

2、Retrofit网络框架封装,支持RxJava

public class RetrofitUtils {
    private Retrofit retrofit;
    private RetrofitApiService retrofitApiService;

    public RetrofitUtils() {
        //   日志拦截器
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
            @Override
            public void log(String message) {
                try {
                    String text = URLDecoder.decode(message, "utf-8");
                    LogT.i("OKHttp-----", text);
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                    LogT.i("OKHttp-----", message);
                }
            }
        });

        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        File cacheFile = new File(MaterialApplication.context.getCacheDir(), "cache");
        Cache cache = new Cache(cacheFile, 1024 * 1024 * 100); //100Mb

        //设置超时时间、拦截、缓存(no)
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(15, TimeUnit.SECONDS)
                .readTimeout(15, TimeUnit.SECONDS)
                .writeTimeout(15, TimeUnit.SECONDS)
                .addInterceptor(interceptor)
                .cache(cache)
                .build();

        Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").serializeNulls().create();

        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(RetrofitApiService.BASE_URL)
                    .client(client)
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//支持RxJava
                    .build();
        }


        retrofitApiService = retrofit.create(RetrofitApiService.class);
    }

    //  创建单例
    private static class SingletonHolder {
        private static final RetrofitUtils INSTANCE = new RetrofitUtils();
    }
    public static RetrofitApiService getApiService() {
        return SingletonHolder.INSTANCE.retrofitApiService;
    }

}
----------------------------------------------------------------------------

public interface RetrofitApiService {

    public static final String BASE_URL = "https://api.douban.com/v2/";//网络请求地址

    @GET("book/search")
    Observable<BookBean> getSearchBook(@Query("q") String name, @Query("tag") String tag, @Query("start") int start, @Query("count") int count);


}
-----------------------------------------------------------------------------

再来一个管理类,管理我们的网络请求:

public class DataManager {
    private static final DataManager ourInstance = new DataManager();

    private RetrofitApiService mRetrofitApiService;

    public static DataManager getInstance() {
        return ourInstance;
    }

    private DataManager() {
        this.mRetrofitApiService = RetrofitUtils.getApiService();
    }


    public Observable<BookBean> getSearchBooks(String name, String tag, int start, int count){
        return mRetrofitApiService.getSearchBook(name,tag,start,count);
    }
}

3、MVP相关操作

a、抽取BasePresenter:

public class BasePresenter<V> {

    public BaseActivty mContext;

    public BasePresenter(BaseActivty context) {
        mContext = context;
    }

    protected Reference<V> mViewRef;

    public void attachView(V view) {
        mViewRef = new WeakReference<V>(view);
    }

    public void detachView() {
        if (mViewRef != null) {
            mViewRef.clear();
            mViewRef = null;
        }
    }

    public V getView() {
        return mViewRef != null ? mViewRef.get() : null;
    }

}

b、抽取BaseActivity,BaseFragment做同样的操作在onCreate方法中判断是否使用MVP模式:

public abstract class BaseActivty<V, T extends BasePresenter<V>> extends AppCompatActivity {

    protected T mPresenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //判断是否使用MVP模式
        mPresenter = createPresenter();
        if (mPresenter != null) {
            mPresenter.attachView((V) this);//因为之后所有的子类都要实现对应的View接口
        }
    }

    //用于创建Presenter和判断是否使用MVP模式(由子类实现)
    protected abstract T createPresenter();

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mPresenter != null) {
            mPresenter.detachView();
        }
    }

}
-----------------------------------------------------------------------------------------------

public abstract class BaseFragment<V, T extends BasePresenter<V>> extends Fragment {


    protected T mPresenter;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //判断是否使用MVP模式
        mPresenter = createPresenter();
        if (mPresenter != null) {
            mPresenter.attachView((V) this);//因为之后所有的子类都要实现对应的View接口
        }
    }
    //用于创建Presenter和判断是否使用MVP模式(由子类实现)
    protected abstract T createPresenter();

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mPresenter != null) {
            mPresenter.detachView();
        }
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
            savedInstanceState) {
        View view = LayoutInflater.from(container.getContext()).inflate(getLayoutId(), container, false);
        initView(view, savedInstanceState);
        return view;
    }
    protected abstract boolean isStatusHave();

    //获取布局文件ID
    protected abstract int getLayoutId();

    protected abstract void initView(View view, Bundle savedInstanceState);

}

4、处理具体业务

基本工作已经做完,现在可以开心的进行网络请求,展示数据了。

public class BookFragment extends BaseFragment<BookView, BookPresenter> implements BookView {

    @Bind(R.id.tv_name)
    TextView mTvName;

    @Override
    protected BookPresenter createPresenter() {
        return new BookPresenter((BaseActivty) getActivity());
    }

    @Override
    protected boolean isStatusHave() {
        return true;
    }

    @Override
    protected int getLayoutId() {
        return R.layout.fragment_book;
    }

    @Override
    protected void initView(View view, Bundle savedInstanceState) {
        ButterKnife.bind(this, view);
        mPresenter.getBook("西游记", null, 0, 1);
    }

    @Override
    public void onGetBook(BookBean mBook) {
        mTvName.setText(mBook.getBooks().get(0).getAuthor().get(0));
    }

    @Override
    public void onError(String error) {
        // TODO: 2017/12/7
    }


    @Override
    public void onDestroyView() {
        super.onDestroyView();
        ButterKnife.unbind(this);
    }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:orientation="vertical"
    android:gravity="center"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

-------------------------------------------------------------

BookPresenter  和  BookView  :

public class BookPresenter extends BasePresenter<BookView> {

    private BookBean mBook;

    public BookPresenter(BaseActivty context) {
        super(context);
    }

    public void getBook(String name, String tag, int start, int count) {
        Observable<BookBean> searchBook = DataManager.getInstance().getSearchBooks(name, tag, start, count);
        searchBook.subscribeOn(Schedulers.io())//请求数据的事件发生在io线程
                .observeOn(AndroidSchedulers.mainThread())//请求完成后在主线程更显UI
                .subscribe(new Observer<BookBean>() {
                    @Override
                    public void onCompleted() {
                        getView().onGetBook(mBook);
                    }

                    @Override
                    public void onError(Throwable e) {
                        getView().onError(e.toString());
                    }

                    @Override
                    public void onNext(BookBean bookBean) {
                        mBook = bookBean;
                    }
                });
    }
}

public interface BookView {
    void onGetBook(BookBean mBook);

    void onError(String error);
}








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MVP(Model View Presenter)其实就是一种项目的整体框架,能让你的代码变得更加简洁,说起框架大家可能还会想到MVC、MVVM。由于篇幅原因,这里我们先不讲MVVM,先来看一下MVC。其实Android本身就采用的是MVC(Model View Controllor)模式、其中Model指的是数据逻辑和实体模型;View指的是布局文件、Controllor指的是Activity。对于很多Android初学者可能会有这样的经历,写代码的时候,不管三七二十一都往Activity中写,当然我当初也是这么干的,根本就没有什么框架的概念,只要能实现某一个功能就很开心了,没有管这么多。当然项目比较小还好,一旦项目比较大,你会发现,Activity所承担的任务其实是很重的,它既要负责页面的展示和交互,还得负责数据的请求和业务逻辑之类的工作,相当于既要打理家庭,又要教育自己调皮的孩子,真是又当爹又当妈。。。那该怎么办呢?这时候Presenter这个继父来到了这个家庭。Presenter对Activity说,我来了,以后你就别这么辛苦了,你就好好打理好View这个家,我专门来负责教育Model这孩子,有什么情况我会向你反映的。这时Activity流下了幸福的眼泪,从此,Model、View(Activity)、Presenter一家三口过上了幸福的生活。。。好了磕个药继续,由于Presenter(我们自己建的类)的出现,可以使View(Activity)不用直接和Model打交道,View(Activity)只用负责页面的显示和交互,剩下的和Model交互的事情都交给Presenter做,比如一些网络请求、数据的获取等,当Presenter获取到数据后再交给View(Activity)进行展示,这样,Activity的任务就大大减小了。这便是MVP(Model 还是指的数据逻辑和实体模型,View指的是Activity,P就是Presenter)框架的工作方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值