MVP+Retrofit+RxJava

我们来一下MVP+Retrofit+RxJava的代码,以及一些逻辑处理:
我们需要用到的依赖:
    implementation 'com.android.support:recyclerview-v7:26.1.0'
    implementation 'com.github.bumptech.glide:glide:3.7.0'
    implementation 'com.facebook.fresco:fresco:0.11.0'
    implementation 'io.reactivex.rxjava2:rxjava:2.1.6'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
    implementation 'com.squareup.okhttp3:okhttp:3.9.0'
    implementation 'io.reactivex.rxjava2:rxjava:2.1.6'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
记得要加网络权限
先看Retrofit:Base中:
public class Base { 
 public static final String BASE_URL="https://api.douban.com/";
}
NewsRervice我在这里用的是POST请求:
import code.xp.zhouliunianxi.bean.NewsEntity;
import io.reactivex.Observable;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
public interface NewsService{
 @FormUrlEncoded
    @POST("v2/movie/top250")
    Observable<NewsEntity> getData(@Field("start") String start,
                                   @Field("count") String count);
}
Retrofit请求数据(单例模式进行封装接口):
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
/** * retrofit请求数据(单例模式进行封装接口) */
public class RetrofitData {
 //网络请求的接口 
private static NewsService newsService;
 //私有化当前工具类的构造器 
private RetrofitData(){}
 //返回网络请求的接口 
public static NewsService getNewsService(){ 
if(newsService==null){ 
//同步锁 保证再多线程的情况下 只有一个当前类的对象 
synchronized (RetrofitData.class){ 
if(newsService==null){ 
//创建retrofit对象 
Retrofit retrofit=new Retrofit.Builder() 
.baseUrl(Base.BASE_URL) 
.addConverterFactory(GsonConverterFactory.create())
 .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
.build(); 
//获取接口的对象 
newsService=retrofit.create(NewsService.class); 
} 
} 
} 
return newsService; 
}
}

再来看retrofit和mvp的结合:
model层的接口:
import io.reactivex.Observer;
public interface INewsModel {
void getData(String key,String count,Observer observer);
}
model层的类:
import code.xp.zhouliunianxi.bean.NewsEntity;
import code.xp.zhouliunianxi.retrofit.NewsService;
import code.xp.zhouliunianxi.retrofit.RetrofitData;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
public class NewsModel implements INewsModel{
@Override
    public void getData(String start,String count,Observer observer) {
        //获取请求数据的接口
        NewsService newsService = RetrofitData.getNewsService();
        //接口获取被观察者的对象
        Observable<NewsEntity> data = newsService.getData(start,count);
        //被观察者订阅观察者
        data.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .flatMap(new Function<NewsEntity, ObservableSource<NewsEntity>>() {
                    @Override
                    public ObservableSource<NewsEntity> apply(NewsEntity newsEntity) throws Exception {
                        return Observable.just(newsEntity);
                    }
                })
                .subscribe(observer);
    }
}
presenter层的类:
import android.util.Log;
import java.util.List;
import code.xp.zhouliunianxi.bean.NewsEntity;
import code.xp.zhouliunianxi.model.NewsModel;
import code.xp.zhouliunianxi.view.INewsView;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
public class NewsPresenter { 
private NewsModel newsModel; 
private INewsView newsView; 
public NewsPresenter(INewsView newsView) { 
this.newsModel = new NewsModel(); 
this.newsView = newsView;
 }
public void getListData(String start,String count){
        newsModel.getData(start, count, new Observer<NewsEntity>() {
            @Override
            public void onSubscribe(Disposable d) {

            }
            @Override
            public void onNext(NewsEntity newsEntity) {
                List<NewsEntity.SubjectsBean> subjects = newsEntity.getSubjects();
                newsView.showData(subjects);
            }
            @Override
            public void onError(Throwable e) {

            }
            @Override
            public void onComplete() {

            }
        });
    }
}view层的接口:import java.util.List;import code.xp.zhouliunianxi.bean.NewsEntity;public interface INewsView {
 void showData(List<NewsEntity.SubjectsBean> list);
    int showStart();
    int showCount();
}
MainActivity中的类:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.util.Log;
import android.widget.Toast;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
import java.util.List;
import code.xp.zhouliunianxi.adapter.RecyclerViewAdapter;
import code.xp.zhouliunianxi.bean.NewsEntity;
import code.xp.zhouliunianxi.presenter.NewsPresenter;
import code.xp.zhouliunianxi.view.INewsView;
public class MainActivity extends AppCompatActivity implements INewsView{
    private XRecyclerView recyclerView;
    private NewsPresenter presenter;
    int start=0;
    int count=10;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        initView();
        presenter = new NewsPresenter(this);
        presenter.getListData("0","10");
        //刷新数据,加载数据
        initShowData();
    }
    private void initShowData() {
        recyclerView.setLoadingListener(new XRecyclerView.LoadingListener() {
            //刷新
            @Override
            public void onRefresh() {
                start=0;
                presenter.getListData(start+" ","10");
                Log.i("====refresh====",start+"============"+count+"");
                Toast.makeText(MainActivity.this, "刷新成功!", Toast.LENGTH_SHORT).show();
                recyclerView.refreshComplete();
            }
            //加载
            @Override
            public void onLoadMore() {
                start++;
                presenter.getListData(start+" ","10");
                Log.i("====load====",start+"====="+count+"");
                Toast.makeText(MainActivity.this, "加载成功!", Toast.LENGTH_SHORT).show();
                recyclerView.loadMoreComplete();
            }
        });
    }
    /**
     * 获取控件
     */
    private void initView() {
        recyclerView=findViewById(R.id.recyclerView);
    }
    @Override
    public void showData(List<NewsEntity.SubjectsBean> list) {
        LinearLayoutManager linearLayoutManager=new LinearLayoutManager(MainActivity.this);
        recyclerView.setLayoutManager(linearLayoutManager);
        RecyclerViewAdapter adapter=new RecyclerViewAdapter(MainActivity.this,list);
        recyclerView.setAdapter(adapter);
    }
    @Override
    public int showStart() {
        return start;
    }
    @Override
    public int showCount() {
        return count;
    }
}


















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值