我们来一下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;
}
}
MVP+Retrofit+RxJava
最新推荐文章于 2022-01-18 15:53:40 发布