美文网首页
<安卓进阶>进一步使用Retrofit,结合MVP使你的网络请求

<安卓进阶>进一步使用Retrofit,结合MVP使你的网络请求

作者: yssazzy | 来源:发表于2017-11-22 15:07 被阅读0次

一、前言

MVP模式是当前比较主流的框架,主要是由它的优点来决定的吧。本文结合了MVP+Retrofit+RxJava三大主流框架,一开始可能会觉得不容易理解,但是真正理解了之后,开发、维护就不是那么痛苦的事情了。

二、Demo介绍

2.1、需要具备哪些知识

读这篇文章之前,你需要了解的知识有:

1、MVP点这里看百度百科介绍

2、Retrofit 2.0

3、RxJava(点击这里看—不错的一个Retrofit+RxJava结合的例子)

4、Butterknife的使用

5、状态栏一体化(android状态栏一体化)

6、CallBack回调思想(说白了就是:成功还是失败了,你总的告诉我一声,我好通知V层来处理[这里可以不用回调,在代码中使用EventBus或者传递一个Handler过来也可以,不建议这样操作])

2.2、优势

1、MVP  高度解耦  提高代码质量

2、Retrofit+RxJava最强的网络访问组合

3、功能易扩展 易维护  易测试

2.3、MVP浅析

1)、MVP的优点:

1、模型与视图完全分离,我们可以修改视图而不影响模型

2、可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部

3、我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。

4、如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)【以上优点参考了百度百科的“MVP模式“】

三.下面进行一下代码的展示

1.1首先添加一些依赖

compile'com.squareup.retrofit2:retrofit:2.0.2'

// Retrofit库

compile'com.squareup.okhttp3:okhttp:3.1.2'

// Okhttp库

compile'com.squareup.retrofit2:converter-gson:2.0.2'

compile'io.reactivex:rxjava:1.0.14'

compile'io.reactivex:rxandroid:1.0.1'

compile'com.squareup.retrofit2:adapter-rxjava:2.0.2'

1.2一定不要忘记添加联网权限,否则会报错

<uses-permission android:name="android.permission.INTERENT"/>

1.3代码的展示

先进行分包,model,presenter,view,再建一个工具类和api类

NetWorkUtils类,工具类,前面是一个单例模式


private    NetWorkUtils(){

}

private static MyApi  api;

public static MyApi getapi(){

      if(api==null){

          synchronized(NetWorkUtils.class){

           if(api==null){

                 OkHttpClient client=new OkHttpClient.Builder()

                    .addInterceptor(new   LoggingInterceptor())

                    .build();

Retrofit retrofit=new Retrofit.Builder()

.baseUrl(MyApi.URL)

.client(client)

.addConverterFactory(GsonConverterFactory.create())

.addCallAdapterFactory(RxJavaCallAdapterFactory.create())

.build();

api=retrofit.create(MyApi.class);

}

}

}

return   api;

}

Api的类


public static final String URL="http://tingapi.ting.baidu.com/";

@GET("v1/restserver/ting?method=baidu.ting.billboard.billList&type=1&size=10&offset=0")

Observable<MyBean> getCall();

Model层的类


public void  getShop(){

NetWorkUtils.getapi().getCall()

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Observer() {

@Override

public void onCompleted() {

System.out.println("====onCompleted===");

}

@Override

public void onError(Throwable e) {

System.out.println("====onError==="+e);

}

@Override

public void onNext(MyBean myBean) {

System.out.println("====onNext==="+myBean);

final List song_list = myBean.song_list;

onShop.getShopSuccess(song_list);

}

});

}

private OnShopon Shop;

public void setOnShop(OnShop onShop) {

this.onShop= onShop;

}

public interface OnShop{

void    getShopSuccess(List song_list);

}

Presenter层的类


public class ShopPresenter implements IShopPresenter,ShopModel.OnShop {

private ShopView shopView;

private final ShopModel shopModel;

private SoftReference softReference;

public ShopPresenter(ShopView shopView) {

this.shopView= shopView;

shopModel=new ShopModel();

shopModel.setOnShop(this);

}

public void  requestShop(){

     shopModel.getShop();

}

@Override

public void Attech(ShopView view) {

     softReference=new  SoftReference(view);

     System.out.println("===attech===="+"绑定");

}

@Override

public void  Detech() {

System.out.println("===detech==="+"解绑");

softReference.clear();

}

@Override

public void  getShopSuccess(List song_list) {

   shopView.getShopSuccess(song_list);

}

}

IShopPresenter类,用来进行解绑和绑定


public interface    IShopPresenter {

void  Attech(Tview);

void   Detech();

}

View层是一个接口,


public interface  ShopView {

void  getShopSuccess(List song_list);

}

BaseActivity的类,Activity的基类,在这个类中重写Oncreate方法时,要选择带有一个参数的,不然会出现问题,本人在这个地方已经吃过一次梗了.


public abstract class  BaseActivity  extends   AppCompatActivity{

T   mPresenter;

@Override

protected void  onCreate(@NullableBundle savedInstanceState) {

super.onCreate(savedInstanceState);

createPresenter();

}

public abstract void   createPresenter();

@Override

protected voidon  Destroy() {

super.onDestroy();

    mPresenter.Detech();

}

}

最后在MainActivity中进行操作.


public class MainActivity extends  BaseActivity   implements   ShopView {

   @BindView(R.id.rlv)

   RecyclerView  rlv;

@Override

protected void  onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ButterKnife.bind(this);

mPresenter.requestShop();

}

@Override

public void   createPresenter() {

mPresenter=new  ShopPresenter(this);

}

@Override

public void  getShopSuccess(finalList song_list) {

LinearLayoutManager    linearLayoutManager=newLinearLayoutManager(MainActivity.this);

rlv.setLayoutManager(linearLayoutManager);

MyAdapter ma=new  MyAdapter(MainActivity.this,song_list);

  rlv.setAdapter(ma);

}

}

好了,这就是一套简单的结合使用.

  希望可以帮助到您! 

相关文章

网友评论

      本文标题:<安卓进阶>进一步使用Retrofit,结合MVP使你的网络请求

      本文链接:https://www.haomeiwen.com/subject/cyanvxtx.html