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

来源:互联网 发布:画流程图的软件 编辑:程序博客网 时间:2024/05/21 11:10


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;    }}




阅读全文
0 0
原创粉丝点击