(安卓) MVP 框架 (Rxjava2+Retrofit)结合 实现网络请求


Model  模型   view 视图    presenter层 (桥梁)        


每一层都有一个接口来下面直接上代码:


=========================================================================

view 层

MainActivity  :

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import com.facebook.drawee.backends.pipeline.Fresco;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import bwie.com.day_rikao_1207.adparer.RecyclerAA;
import bwie.com.day_rikao_1207.bean.Newslist;
import bwie.com.day_rikao_1207.presenter.DataPresenter;
import bwie.com.day_rikao_1207.view.IView;

import static android.widget.LinearLayout.VERTICAL;

public class MainActivity extends AppCompatActivity implements IView{

    private RecyclerView recy;
    private DataPresenter dataPresenter;
    private  List<Newslist> list=new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Fresco.initialize(this);
        setContentView(R.layout.activity_main);

        recy = (RecyclerView) findViewById(R.id.recy);

        HashMap<String,String> map = new HashMap<>();
        //http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10
        map.put("key","71e58b5b2f930eaf1f937407acde08fe");
        map.put("num","10");
        dataPresenter = new DataPresenter();
        dataPresenter.acceachView(this);
        dataPresenter.getData(map);

    }

    @Override
    public void success(Object o) {
        if (o instanceof List){
            List<Newslist> news= (List<Newslist>) o;

            list.addAll(news);
            RecyclerAA recyclerAA = new RecyclerAA(this,list);
            recy.setAdapter(recyclerAA);
            LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,VERTICAL,false );
            recy.setLayoutManager(linearLayoutManager);
            recyclerAA.notifyDataSetChanged();
        }

    }

    @Override
    public void Failes(Exception e) {

    }

    //避免内存泄漏
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (dataPresenter!=null){
            dataPresenter.detechView();
        }
    }
}

view接口:
public interface IView {

    void success(Object o);
    void Failes(Exception e);
}

============================================================
Presenter 层:
import java.util.List;
import java.util.Map;

import bwie.com.day_rikao_1207.bean.JsonRootBean;
import bwie.com.day_rikao_1207.bean.Newslist;
import bwie.com.day_rikao_1207.model.DataModel;
import bwie.com.day_rikao_1207.model.IModel;
import bwie.com.day_rikao_1207.view.IView;
import io.reactivex.Flowable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import io.reactivex.subscribers.DisposableSubscriber;

/**
 * Created by 迷人的脚毛!! on 2017/12/7.
 */

public class DataPresenter implements BasePresenter{

    private IView iv;
    private DisposableSubscriber<JsonRootBean<List<Newslist>>> subscriber;

    public void acceachView(IView iv){
        this.iv=iv;
    }

    public void detechView(){
        if (iv!=null){
            iv=null;
        }
        if (subscriber!=null){
            if (!subscriber.isDisposed()){
                subscriber.dispose();
            }
        }
    }

    @Override
    public void getData(Map<String, String> map) {

        IModel model= new DataModel(this);
        model.getData(map);
    }

    public void getDatas(Flowable<JsonRootBean<List<Newslist>>> flowable){
        subscriber = flowable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(new DisposableSubscriber<JsonRootBean<List<Newslist>>>() {
                    //普通事件
                    @Override
                    public void onNext(JsonRootBean<List<Newslist>> listJsonRootBean) {

                        if (listJsonRootBean != null) {
                            List<Newslist> newslist = listJsonRootBean.getNewslist();
                            if (newslist != null) {
                                iv.success(newslist);
                            }
                        }

                    }

                    //异常事件
                    @Override
                    public void onError(Throwable t) {
                        iv.Failes(new Exception(t));

                    }

                    @Override
                    public void onComplete() {

                    }
                });


    }
}

p层接口:
public interface BasePresenter{
    void getData(Map<String,String> map);

}

===========================================================
model层:
import io.reactivex.Flowable;

/**
 * Created by 迷人的脚毛!! on 2017/12/7.
 */

public class DataModel implements IModel{

    private DataPresenter presenter;

    public DataModel(DataPresenter presenter) {
        this.presenter = presenter;
    }

    @Override
    public void getData(Map<String, String> map) {

        Flowable<JsonRootBean<List<Newslist>>> flowable = RetrofitUtil.getInstant().getApiService().getData(map);

        presenter.getDatas(flowable);
    }
}

IModel 接口:
public interface IModel {

    void getData(Map<String,String> map);

}


========================================================================

public interface ApiService {

    //http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10
    @GET("nba/")
    Flowable<JsonRootBean<List<Newslist>>> getData(@QueryMap Map<String,String> map);
}


RetrofitUtil   工具类:
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
 

public class RetrofitUtil {
    private static volatile RetrofitUtil instant;
    private ApiService apiService;


    private RetrofitUtil() {
        Retrofit retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .baseUrl("http://api.tianapi.com/")
                .build();

        apiService = retrofit.create(ApiService.class);
    }

    public static RetrofitUtil getInstant(){
        if (null==instant){
            synchronized (RetrofitUtil.class){
                if (instant==null){
                    instant=new RetrofitUtil();
                }
            }
        }
        return instant;

    }
    public ApiService getApiService(){
        return apiService;
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值