/SKStructure

基于MVP的Android基础架构

Primary LanguageJava

SKStructure

一、基本写法

1、定义Application

自定义Application继承SKApplication  

2、定义view层

setp1、定义IView。  
setp2、定义View。继承SKActivity<P extends SKIPre>,通过指定泛型注入Presenter。  

interface IJokeListActivity {  
    void showJokeList(List<JokeData.JokeBean> jokeList);  
}  
public class JokeListActivity extends SKActivity<IJokeListPre> implements IJokeListActivity{}  

同样,Fragment也是一样。  

3、定义Presenter层

step1、定义IPresenter。  
step2、定义Presenter。继承SKPre<U>,通过泛型注入IView。  
step3、给IPresenter添加注解@Impl指定IPresenter的实现类Presenter,从而建立关联。  

@Impl(JokeListPre.class)  
public interface IJokeListPre extends SKIPre {  
    @Background(BackgroundType.HTTP)  
    void loadJokeList();  
}  
class JokeListPre extends SKPre<IJokeListActivity> implements IJokeListPre {}  

4、view调用presenter

在Activity中,直接使用方法pre()来调用方法。  
pre().loadJokeList();  

5、presenter调用view

在Presenter中,直接调用方法ui()来调用方法。  
ui().showJokeList(jokeDataResponse.getData());  

二、presenter的同步和异步操作

在IPresenter申明方法的时候,添加注解@Background。  
取值为Background下的SINGLEWORK:单线程同步操作  
                HTTP:网络线程  
                WORK:工作线程  
例如demo中的     @Background(BackgroundType.HTTP)  
                void loadJokeList();  

三、presenter中的防止连续调用

同样,在IPresenter申明方法的时候,添加注解@Repeat,取值为boolean型,默认为false。  
这样,如果@Repeat(false)这个方法的方法体还没有执行完成是不会再次执行的。  

四、presenter中的拦截器

step1、自定义自己的startInterceptor继承SKPreMethodStartInterceptor和endInterceptor继承SKPreMethodEndInterceptor。  
step2、在Application中,重写createMethodInterceptor,通过builder模式来创建SKMethodProxy。  
step3、在IPresenter的方法中,添加@Interceptor注解,传入value。  
那么,在这个方法执行的时候,如果interceptor不为空,value!=-1,就会回调interceptor的interceptor方法  

五、网络

在presenter中请求网络数据,调用http方法,直接返回实体。例如在demo中    
JokeData jokeDataResponse = http(ApiServices.class).loadJokeList(2, 1);
解析:这里使用了Retrofit,因为有@Background来处理异步操作,因此去掉CallAdapter。通过修改Retrofit的源码,在create方法里边已经处理好了converter。  
使用:step1、在自定义的Application中,重写createRetrofit方法,创建Retrofit,初始化参数。
     step2、调用http方法,传入ApiServices.class,调用方法。

六、跨作用域调用

用于RecyclerView.holder的点击等业务处理、跨Activity通信、Fragment和Activity通信、甚至于任何地方来操作ui。
用法:给pre()方法传入IPresenter.class。未提供默认pre(xxx.class)调用的地方,可使用SKHelper.pre(xxx.class,index)。
例如demo中:JokeListHolder中
        R.id.forward -> {  
            Log.i("tag", "click forward")  
            SKHelper.pre(IJokeListPre::class.java, 0).forward(dataBean.soureid)  
        }  
        R.id.up -> {  
            SKHelper.pre(IJokeListPre::class.java, 0).up(dataBean.soureid)  
        }  
        R.id.down -> {  
            SKHelper.pre(IJokeListPre::class.java, 0).down(dataBean.soureid)  
        }  

七、Display层

和显示、跳转相关的操作。比如dialog的显示,popWindow的显示,activity跳转、Fragment添加都交由Display层操作。