浅谈retrofit2.1+okhttp3 搭建MVP框架

来源:互联网 发布:linux简单管道 编辑:程序博客网 时间:2024/06/05 06:42

这是第一篇博客,如有写的不对的地方请指出,本人会虚心学习,共同进步,谢谢!


正文:


整个框架如下图所示:



这是我自己理解的MVP架构,针对各个文件简单的解释一下。


一、各个文件解释

1、adapters:里面存放各个View的适配器;

2、base:里面存放一些基类;


3、controllers:里面存放各个业务网络请求控制类;

注:因为请求后台数据时,后台统一由Controller层来接受参数、然后进行业务逻辑的实现。所以本人就以此来存放各个业务网络请求类。


4、daos:里面存放操作数据库一下方法类和共用方法类;

5、db:里面放数据库初始化类;

6、entitys:里面存放一些bean类、消息通知类、网络请求类、数据回调类、retrofit异步回调接受类;


7、http:里面存放网络请求类;


8、interfaces:里面存放一些适配器回调接口类、view层回调接口类、presenters层回调接口类、retrofit统一api地址服务接口;


9、mineview:里面存放一些自定义view、布局等类;

10、presenterimpls:里面存放各个业务presenter具体实现类;


11、service:里面存放一些业务涉及到的服务类;


12、utils:里面存放一些公用的方法;


13、Constants:里面存放一些公共的参数;

 public final static String ImageUrlIp = "x'x'x'x'x";


14、MyAapplication:里面存放一些全局变量、Fresco初始化;

 @Override    public void onCreate() {        super.onCreate();        Fresco.initialize(this);    }

以上是我个人针对MVP里面,搭建出来的框架,如有不妥的地方,还请指出,谢谢!


二、简单加载图片的具体实现


1、MainAtivity

1)、 MainActivity继承基类和BannerViewInter接口,并实现具体方法;

2)、实例化BannerPresenterInterImpl实现类,传入相关参数,调用图片请求显示方法;

3)、通过BannerViewInter接口的showBannerImg方法,接受返回图片地址url,调用图片显示方法,显示图片。

public class MainActivity extends BaseActivity implements BannerViewInter{    @InjectView(R.id.am_sdv) public SimpleDraweeView bannerImg;    private BannerPresenterInterImpl bannerPresenterInterimpl;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ButterKnife.inject(this);        super.init();    }    @Override    public void initView() {        bannerPresenterInterimpl = new BannerPresenterInterImpl(this,this);        bannerPresenterInterimpl.getBannerImg();    }    @Override    public void initEvent() {    }    @Override    public void initData() {    }    @Override    public void showBannerImg(String url) {        bannerImg.setImageURI(CommonUtils.setImgUri(url));    }    @Override    public void onResponseFail(String fail) {        Toast.makeText(this,fail,Toast.LENGTH_LONG).show();    }    @Override    public void onFailure(String failure) {        Toast.makeText(this,failure,Toast.LENGTH_LONG).show();    }

2、BannerViewInter

1)、继承基类接口,自定义具体业务方法;

public interface BannerViewInter extends BaseViewInter{    void showBannerImg(String url);}
2)、基类接口。

public interface BaseViewInter {    void onResponseFail(String fail);    void onFailure(String failure);}
3、BannerPresenterInterImpl

1)、继承BannerPresenterInter接口,实现具体方法;

2)、实例化BannerController控制类;

3)、调用图片请求方法;

4)、通过onBannerResponse方法 接收网络返回的数据;

5)、并调用BannerViewInter接口显示图片方法,回调给主线程,显示图片。

注:这里就可以实现具体的业务逻辑,通过接口,回调给主线程。

public class BannerPresenterInterImpl implements BannerPresenterInter {    private Context context;    private BannerViewInter bannerViewInter;    private BannerController bannerController;    public BannerPresenterInterImpl(Context context,BannerViewInter bannerViewInter){        this.context = context;        this.bannerViewInter = bannerViewInter;    }    public void getBannerImg(){        bannerController = new BannerController(context,this);        bannerController.getBanner();    }    @Override    public void onBannerResponse(List<BannerResponse> responseList) {        bannerViewInter.showBannerImg(responseList.get(0).getBannerUrl());    }    @Override    public void onResponseFail(String fail) {        bannerViewInter.onResponseFail(fail);    }    @Override    public void onFailure(String failure) {        bannerViewInter.onFailure(failure);    }}

4、BannerController

1)、初始化api服务接口、BannerPresenterInter接口等;

2)、调用服务接口显示图片的api,然后异步方法获取图片资源。

public class BannerController {    private Context context;    private BannerPresenterInter bannerPresenterInter;    private ApiServiceInterface apiServiceInterface;    public BannerController(Context context,BannerPresenterInter bannerPresenterInter){        this.context = context;        this.bannerPresenterInter = bannerPresenterInter;        apiServiceInterface = RetrofitHttp.getApi();    }    public void getBanner(){        Call<BannerObject> call = apiServiceInterface.homeBannerApi();        call.enqueue(new Callback<BannerObject>() {            @Override            public void onResponse(Call<BannerObject> call, Response<BannerObject> response) {                BannerObject object = response.body();                if(object.getCode() == BaseController.CODE){                    bannerPresenterInter.onBannerResponse(object.getResult());                }else{                    bannerPresenterInter.onResponseFail(object.getMessage());                }            }            @Override            public void onFailure(Call<BannerObject> call, Throwable t) {                bannerPresenterInter.onFailure(t.toString());            }        });    }}
5、Okhttp

对Okhttp进行封装,添加打印日志等方法,方便查看返回结果及后台报错原因。

public class OkhttpHttp {    public static OkHttpClient getOkHttpClient(){        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {            @Override            public void log(String message) {                Log.i("message",message);            }        });        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);        OkHttpClient client = new OkHttpClient.Builder()                .addInterceptor(new Interceptor() {                    @Override                    public Response intercept(Chain chain) throws IOException {                        Request request = chain.request();                        Log.i("request",request.toString());                        Response proceed = chain.proceed(request);                        Log.i("procceed",proceed.toString());                        return proceed;                    }                })                .addInterceptor(httpLoggingInterceptor)                .connectTimeout(5000, TimeUnit.SECONDS)                .build();        return client;    }}

6、RetrofitHttp

添加请求返回可以接受的参数及api服务接口。

public class RetrofitHttp {    public final static String IP = "xxxx";    public final static String Http = "http://"+IP+"/mobile-web/mobile/";    public static ApiServiceInterface apiServiceInterface;    public static Retrofit retrofit;    private RetrofitHttp(){}    public static ApiServiceInterface getApi(){        if(retrofit == null){            retrofit = new Retrofit.Builder()                    .baseUrl(Http)                    .addConverterFactory(GsonConverterFactory.create())                    .addConverterFactory(ScalarsConverterFactory.create())                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())                    .client(OkhttpHttp.getOkHttpClient())                    .build();        }        apiServiceInterface = retrofit.create(ApiServiceInterface.class);        return apiServiceInterface;    }}
7、ApiServiceInterface

里面存放统一api请求地址。

public interface ApiServiceInterface {    String HOME = "home/"; //主页    @GET(HOME+"getTopBannerList")    Call<BannerObject> homeBannerApi(); //banner}
8、BannerObject

里面存放请求回来,接受参数。

public class BannerObject extends BaseResponseObject{    private List<BannerResponse> result;    public List<BannerResponse> getResult() {        return result;    }    public void setResult(List<BannerResponse> result) {        this.result = result;    }}





1 0