您的位置:首页 > 编程语言 > Java开发

RxJava+Retrofit+MVP

2017-12-19 20:04 183 查看
导依赖
compile 'io.reactivex.rxjava2:rxjava:2.1.7'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
请求工具
public interface ApiService {
@GET("93app/data.do")
Flowable<NewsBean<List<MsgBean>>>getNews(@QueryMap Map<String,String> map);
}
RetrofitUtils
public class RetrofitUtils {
private static volatile RetrofitUtils instance;
private final ApiService apiService;

private RetrofitUtils(String url) {
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl(url)
.build();
apiService = retrofit.create(ApiService.class);
}
public static RetrofitUtils getInstance(String url){
if (instance==null){
synchronized (RetrofitUtils.class){
if (instance==null){
instance=new RetrofitUtils(url);
}
}
}
return instance;
}
public ApiService getApiService(){
return apiService;
}
}

model层接口

public interface IModel {
void getData(Map<String,String> map,String url);
}
model获取数据
public class NewModel implements IModel {
private NewsPresenter newsPresenter;
public NewModel(NewsPresenter newsPresenter){
this.newsPresenter=newsPresenter;
}
@Override
public void getData(Map<String, String> map, String url) {
Flowable<NewsBean<List<MsgBean>>> flowable = RetrofitUtils.getInstance(url).getApiService().getNews(map);
newsPresenter.getNews(flowable);
}
}
presenter层接口
public interface BasePresenter {
void getData(Map<String,String> map,String url);
}
presenter逻辑操作
public class NewsPresenter implements BasePresenter{
private IView iView;
private DisposableSubscriber subscriber;

public void attachView(IView iView){
this.iView=iView;
}
public void detachView(){
if (iView!=null){
iView=null;
}
if (subscriber!=null){
if (!subscriber.isDisposed()){
subscriber.dispose();
}
}
}
public void getNews(Flowable<GoodsBean> flowable){
subscriber = (DisposableSubscriber)flowable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableSubscriber<GoodsBean>() {
@Override
public void onNext(GoodsBean listNewsBean) {
// if (listNewsBean != null) {
iView.onSuccessed(listNewsBean);
// }
}

@Override
public void onError(Throwable t) {
iView.onFailed(new Exception(t));
Log.e(TAG, "onNext: "+t );
}

@Override
public void onComplete() {

}
});
}

@Override
public void getData(Map<String, String> map, String url) {
NewModel model = new NewModel(this);
model.getData(map,url);
}
}


View层接口

public interface IView {
void onSuccessed(NewsBean<List<MsgBean>> listNewsBean);
void onFailed(Exception e);
}
View层展示数据
public class MainActivity extends AppCompatActivity implements IView {

private RecyclerView recyclerView;
private RVAdapter adapter;
private NewsPresenter presenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportActionBar().hide();
Fresco.initialize(this);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.rv);
//初始化数据
getData();
}
//初始化数据
private void getData() {
HashMap<String, String> map = new HashMap<>();
map.put("channelId","0");
map.put("startNum","0");
presenter = new NewsPresenter();
presenter.attachView(this);
presenter.getData(map,"http://www.93.gov.cn/");
}

/**
* 成功方法
* @param listNewsBean
*/
@Override
public void onSuccessed(NewsBean<List<MsgBean>> listNewsBean) {
List<MsgBean> data = listNewsBean.getData();
LinearLayoutManager manager = new LinearLayoutManager(this);
recy
4000
clerView.setLayoutManager(manager);
adapter = new RVAdapter(MainActivity.this,data);
recyclerView.setAdapter(adapter);

}

@Override
public void onFailed(Exception e) {

}

/**
* 防止内存泄漏
*/
@Override
protected void onDestroy() {
super.onDestroy();
if (presenter!=null){
presenter.detachView();
}
}
}
recycleview子布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:padding="20dp"
android:layout_height="match_parent">
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/img_logo"
android:layout_alignParentRight="true"
fresco:roundAsCircle="true"
android:layout_width="70dp"
android:layout_height="70dp" />

<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:textSize="22dp"
android:text="标题"
android:layout_toLeftOf="@id/img_logo"
android:layout_height="70dp" />

</RelativeLayout>
recycleview适配器
public class RVAdapter extends RecyclerView.Adapter<RVAdapter.ViewHolder>{
private Context context;
private List<MsgBean> data;

public RVAdapter(Context context, List<MsgBean> data) {
this.context = context;
this.data = data;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = View.inflate(context, R.layout.item, null);
ViewHolder holder = new ViewHolder(view);
return holder;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.tvTitle.setText(data.get(position).getTitle());
holder.imgLogo.setImageURI(data.get(position).getImageUrl());
}

@Override
public int getItemCount() {
return data.size();
}

class ViewHolder extends RecyclerView.ViewHolder{

private final TextView tvTitle;
private final SimpleDraweeView imgLogo;

public ViewHolder(View itemView) {
super(itemView);
tvTitle = (TextView) itemView.findViewById(R.id.tv_title);
imgLogo = (SimpleDraweeView) itemView.findViewById(R.id.img_logo);
}
}
}
此框架暂不完美,Loading...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: