22.android 简单封装的mvp+retrofit+rxjava+单例模式

本文详细介绍了一种常见的Android应用开发架构MVP(Model-View-Presenter)的三种实现方式,包括网络请求模块的搭建、Presenter层的职责划分及View层的数据处理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//三种MVP的搭建方式,主要是p层不同,最后一种最简便

//--------------------------------------第一部分--------------------------------------

//1.第一步 建立m层RetrofitMannager,发起网络请求。再建立三个接口,一个单例模式类

//----------------先建立IHttp接口

public interface IHttp {
    void getRetrofit(String url,ICallback iCallback);
}

//------------------这个ICallback也是个接口,里面封装了两个方法,一个请求成功,一个请求失败

//建立这个ICallback接口

public interface ICallback {
//成功
    void onSuess(String string);
//失败
    void onFalie(String string2);
}

//---------------------建立请求方式QinQiu也是个接口

//Observable要用rx的,别错了,泛型ResponseBody,就可以代表任何实体类

public interface QinQiu {
    @GET
    Observable<ResponseBody>getinfo(@Url String url);
}

//------------------------封装了一个单例模式 Danli,返回一个retrofit对象,在任何地方都能调用,就不用每次发起一个网络请求,写一个retrofit了

public class Danli {
    private static Danli danli;
    private Retrofit retrofit;

    private Danli(){
        retrofit=new Retrofit.Builder()
                .baseUrl("http://v.juhe.cn/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
    }
    //同步锁
    public static Danli getDanli(){
        if (danli==null){
            synchronized (Danli.class){
                if (danli==null){
                    danli=new Danli();
                }
            }
        }
        return danli;
    }

    public Retrofit getRetrofit() {
        return retrofit;
    }
}

//好了上面的三个接口和一个单例模式类写完后,开始重下面的重点

//---------------------实现IHttp接口 重写getRetrofit方法

public class RetrofitMannager implements IHttp {
    @Override
    public void getRetrofit(String url, final ICallback iCallback) {
//danli 单例模式  通过单例模式 Danli 调到retrofit对象,发起请求
        Retrofit retrofit = Danli.getDanli().getRetrofit();
        QinQiu qinQiu = retrofit.create(QinQiu.class);
        qinQiu.getinfo(url)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<ResponseBody>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
//用iCallback得到请求失败的信息
                        iCallback.onFalie(e.getMessage());
                    }

                    @Override
                    public void onNext(ResponseBody responseBody) {
                        try {
//responseBody转成string类型
                            String string = responseBody.string();
//用iCallback得到请求成功的数据
                            iCallback.onSuess(string);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                });
    }
}

///-------------------------------------------------------------------------分割线-----------------------------------------------------------------------------

//2.第二步 建立这个p层pceng,这个pceng 我又让它实现了一个IPresenter接口

public class pceng implements IPresenter{

 

//--------------------- 写这个IPresenter接口

//这个接口里简单就让他传递一个url地址

public interface IPresenter {
    void onStart(String url);
}

//好 我们返回pceng,实现接口后重写方法,再在pceng里定义m层对象。

//定义一个未创建的m层对象。RetrofitMannager retrofitMannager

//再定义出v层对象来,并且构造方法,这样v层,p层,m层,通过p层练习到了一起。

private RetrofitMannager retrofitMannager;
private MainActivity mainActivity;

public pceng(MainActivity mainActivity) {
    this.mainActivity = mainActivity;
//这里要new出m层
    retrofitMannager=new RetrofitMannager();
}

//重写的IPresenter 接口方法 传url
@Override
public void onStart(String url) {
//这里是m层retrofitMannager里的发起网络请求的方法,需要new ICallback出来
    retrofitMannager.getRetrofit(url, new ICallback() {
        @Override
        public void onSuess(String string) {
//v层得到string 数据
            mainActivity.getData(string);
        }

        @Override
        public void onFalie(String string2) {
//v层得到string 请求失败的信息
            mainActivity.getFalie(string2);
        }
    });
}

 

//-----------------------------------------------------------------------------------分割线-------------------------------------------------------------------
 

//3.第三步你要在哪请求数据发起网络请求,就在哪个Activity或fragment里建立接口IView并实现,接口里写两个方法,一个获取数据,一个获取请求失败的信息。

//-----------------------------建立接口 写两个方法

public interface IView {
    void getData(String string);
    void getFalie(String string2);
}

//-----------------------------实现接口

public class MainActivity extends AppCompatActivity implements View.OnClickListener, IView{
}

//-------------------------实现接口后 重写这两个方法

@Override
public void getData(String string) {
//请求成功后回来的数据 还需要一个实体bean类 通过gson解析,数据就出来了,不过一定得记得通过p层对象pceng发起网络请求
    Gson gson = new Gson();
    Bean bean = gson.fromJson(string, Bean.class);
    Bean.ResultBean result = bean.getResult();
    String author_name = result.getData().get(0).getAuthor_name();
    Toast.makeText(this, author_name + "", Toast.LENGTH_SHORT).show();
}

@Override
public void getFalie(String string2) {
//这是失败返回来的信息
    Toast.makeText(this, string2 + "失败", Toast.LENGTH_SHORT).show();
}

 

//4.第四步  在当前页面,就是你想在哪请求数据,就在哪写,我是在这个Activity里写了个点击事件,new pceng对象,发起

//----------------------------在这个Activity里建立p层对象,直接new 出来,再调用p层方法,传个url请求地址过去。

switch (v.getId()) {
    case R.id.mButton:
//new了个 p层
        pceng pceng = new pceng(this);
//调用pceng 方法
        pceng.onStart("http://v.juhe.cn/toutiao/index?type=shehui&key=85a15c14d09f886463dcd52d11701537");
        break;
}

//这样就写完了,可以多次复用,每次只需要 pceng.onStart("这里是url地址”)传递的url变一下就行了,是不是很方便呢

 

//--------------------------------------第二部分--------------------------------------

 

//----------------------------------------------------------------------分割----------------------------------------------------------------------------------

//-----------------------上面的写法是在v层通过new Gson 解析的,如果不想在v层解析,在p层解析的话,那么写下边这些-------------
//--------------------------------------------------v层实现IView接口,泛型是T--------------------------------------------------------

public interface IView <T>{
    <T>void onSuess(T t);
    void onFalie(String string);
}

//-------------------------------------------------v层实现IView接口,重写方法Object 类型-------------------------------------------------

@Override
public void onSuess(Object o) {
  //成功

}

@Override
public void onFalie(String string) {
   //失败
}

//------------------------------------------p层解析------------------------------------------------------------
 

public class Presenter implements IPresenter {
    private HomeFragment homeFragment;
    private RetrofitMannager retrofitMannager;

    public Presenter(HomeFragment homeFragment) {
        this.homeFragment = homeFragment;
        retrofitMannager=new RetrofitMannager();
    }

    @Override
    public void onStart(String url) {
        retrofitMannager.getRetrofit(url, new ICallback() {
            @Override
            public void onSuess(String string) {
//解析传递一个bean对象
                Gson gson = new Gson();
                Bean bean = gson.fromJson(string, Bean.class);
                homeFragment.onSuess(bean);
            }

            @Override
            public void onFalie(String string) {
                homeFragment.onFalie(string);
            }
        });
    }

 

//----------------------------------回到v层判断---------------------------------------------
 

@Override
public void onSuess(Object o) {
//通过传递回来的Object 类型的和Bean类比较
    if (o instanceof Bean){
        String author_name = ((Bean) o).getResult().getData().get(0).getAuthor_name();
        Toast.makeText(getContext(), "成功"+author_name, Toast.LENGTH_SHORT).show();
        Log.e("TAGH1",author_name);
    }

}

@Override
public void onFalie(String string) {
    Toast.makeText(getContext(), "失败"+ string, Toast.LENGTH_SHORT).show();
    Log.e("TAGH1s",string+"失败");
}

//-----------------------------------------------------------------分割线-----------------------------------------------------------------------------------

 

 

//--------------------------------------第三部分--------------------------------------

 //上面的做法还有不足,假如一个项目100个不同的网络请求串,都不相同,那么是不是要在p层里new 100个v层对象,有100个请求的方法?

//所以 咱们可以这么写。。。共用一个p层,一个方法,一个构造方法,但是不new v层了

//p层 ,IPresenter接口里就还是不动 里面就一个方法 void onStart(String url)

public class Presenter implements IPresenter {

//定义了homeFragment和home2Activity
    private HomeFragment homeFragment;
    private Home2Activity home2Activity;

//共用的构造方法 注意里面全是泛型t
    public <T>Presenter(T t) {
//通过这个泛型比较 是否是HomeFragment ,是就强转
        if (t instanceof HomeFragment ){
            this.homeFragment = ((HomeFragment) t);
        }
//通过这个泛型比较 是否是Home2Activity,是就强转
        if (t instanceof Home2Activity){
            this.home2Activity = ((Home2Activity) t);
        }
    }


//new 出m层对象
    RetrofitMannager retrofitMannager=new RetrofitMannager();

    @Override
    public void onStart(final String url) {
//通过m层对象发起,传一个url到m层,传回来一个接口ICallback,里面有成功和失败的方法
        retrofitMannager.getRetrofit(url, new ICallback() {

            //成功
            @Override
            public void onSuess(String string) {
//new gson 准备解析
                Gson gson = new Gson();
//通过switch判断url地址,来确认你传回来的是哪个字符串, 就用那个Bean解析,
                switch (url){
                    case Url.url1:
                        Bean bean = gson.fromJson(string, Bean.class);
                      //再让对应的页面得到
                        homeFragment.onSuess(bean);
                        break;
                    case Url.url2:
                       Bean2 bean2 = gson.fromJson(string,Bean2.class);
                        home2Activity.onSuess(bean2);
                        break;
                }
            }


            //失败 也是一样的道理
            @Override
            public void onFalie(String string) {
                switch (url){
                    case Url.url1:
                        homeFragment.onFalie(string);
                        break;
                    case Url.url2:
                        home2Activity.onFalie(string);
                        break;
                }
            }
        });
    }

}

 

 

//然后v 层和正常一样就行。因为p层构造方法是泛型t的,所以new Presenter();括号里传那个都行。因为你在p层里判断强转了。

Presenter presenter = new Presenter(HomeFragment.this);
presenter.onStart(Url.url1);

//-------------------------------------------------------------------完--------------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值