SkillAgentSearch skills...

MVPHulk

Android MVP 快速集成方案 (支持AndroidX)

Install / Use

/learn @madreain/MVPHulk

README

MVPHulk Android MVP 快速集成方案

Logo


MVPHulk是RxJava+Rxlifecycle+Okhttp+Retrofit+Dagger2+MVP框架,结合BaseRecyclerViewAdapterHelper和SmartRefreshLayout封装可刷新加载的Base类并结合接口回掉做了三种接口交互方式, Butterknife用于View注入,EventBus用于通信,ARouter用于组件化路由跳转。

使用第三方库

  1. RxJava JVM响应式扩展Reactive Extensions 用于使用Java VM的可观察序列编写异步和基于事件的程序的库
  2. RxAndroid 用于Android的RxJava绑定
  3. Rxlifecycle 使用RxJava的Android应用程序的生命周期处理API
  4. RxPermissions RxJava支持的Android运行时权限
  5. Okhttp 一个用于Android、Kotlin和Java的HTTP客户端
  6. Retrofit 为Android和Java提供安全的HTTP客户端
  7. Glide 面向Android的图像加载和缓存库
  8. Gson 一个Java序列化/反序列化库,用于将Java对象转换为JSON并返回
  9. Dagger2 Android和Java的快速依赖注入器
  10. Butterknife View注入框架
  11. EventBus Android和Java的事件总线,简化了活动、片段、线程、服务等之间的通信。代码越少,质量越好
  12. ARouter 帮助 Android App 进行组件化改造的路由框架
  13. BaseRecyclerViewAdapterHelper 功能强大、灵活的万能适配器
  14. SmartRefreshLayout Android智能下拉刷新框架
  15. topsnackbar Top Snackbar

项目配置介绍

方法一:直接引入源码,在app的build.gradle

1.项目的build.gradle

allprojects {
    repositories {
        maven { url "https://jitpack.io" }
        google()
        jcenter()
    }
}

2.app的build.gradle

api project(':hulk')

//dagger2
annotationProcessor rootProject.ext.dependencies["dagger2-compiler"]
annotationProcessor rootProject.ext.dependencies["dagger2-android-processor"]
//butterknife
api rootProject.ext.dependencies["butterknife"]
annotationProcessor rootProject.ext.dependencies["butterknife-compiler"]
//arouter
annotationProcessor rootProject.ext.dependencies["arouter-compiler"]

JAVA8的支持

compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

方法二:设置依赖项

1.项目的build.gradle

allprojects {
    repositories {
        maven { url "https://jitpack.io" }
        google()
        jcenter()
    }
}

2.app的build.gradle

在android下添加

compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
   }
//1.0.0版本
api 'com.madreain:hulk:1.0.0'
//androidx版本
api 'com.madreain:hulk:1.0.0-andx'

//dagger2
annotationProcessor rootProject.ext.dependencies["dagger2-compiler"]
annotationProcessor rootProject.ext.dependencies["dagger2-android-processor"]
//butterknife
api rootProject.ext.dependencies["butterknife"]
annotationProcessor rootProject.ext.dependencies["butterknife-compiler"]
//arouter
annotationProcessor rootProject.ext.dependencies["arouter-compiler"]

项目入门介绍

1.配置Application,继承HulkApplication

⚠️注意:因为涉及到的第三方库比较多,dex的方法数量被限制在65535之内,这就是著名的64K(64*1024)事件, 需引入MultiDex来解决这个问题,创建好Application,记得在AndroidManifest.xml中修改application的name

记得修改application的style

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowBackground">@color/windowBackground</item>
        <item name="colorControlNormal">@color/windowBackground</item>
        <item name="colorControlActivated">@color/colorAccent</item>
    </style>

HulkConfig配置项配置相关设置如下


private static Application application;//设置Application
private static String baseUrl;//服务地址
//这里可根据自身项目设置是统一返回状态的还是增删改查不同返回状态的值
//设置统一正常态返回值
private static String retSuccess;//returnCode 正常态的值
//设置增删改查不一样的正常态返回值
private static List<String> retSuccessList;
private static boolean logOpen;//日志开关
private static boolean changeBaseUrl;//切换环境
private static Retrofit retrofit;//Retrofit设置
private static List<Interceptor> okHttpInterceptors = new ArrayList<>();//oKHttp拦截器
private static List<IReturnCodeErrorInterceptor> retCodeInterceptors = new ArrayList<>();//接口返回值拦截器
private static List<IVersionDiffInterceptor> versionDiffInterceptors = new ArrayList<>();//服务端版本号和本地版本号不一致拦截器
private static long connectTimeout = 15;//连接超时时间:单位秒
private static long readTimeout = 30;//单位秒
private static long writeTimeout = 60;//单位秒
private static Drawable glidePlaceHolder;//默认图
private static Drawable glideHeaderPlaceHolder;//默认头像占位图

    

⚠️注意:Glide相关注意事项

Glide的引用,需创建ids.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="glide_tag" type="id" />
</resources>

配置参考如下,配置这些前得先参考-dagger2和mvp结合-配置相关的HulkConfig创建相关类、接口

⚠️注意:可跳过接下来的配置参考直接从-dagger2和mvp结合开始看


public class MVPHulkApplication extends HulkApplication {

    private static Appcomponent appcomponent;

    public static Appcomponent getAppcomponent() {
        return appcomponent;
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

    @Override
    public void initHulkConfig() {
        //DaggerAppComponent的生成make project一下就行
        appcomponent = DaggerAppcomponent.builder().apiModule(new com.madreain.hulk.application.ApiModule()).build();
        //消息拦截器
        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);
        //配置项
        HulkConfig.builder()
                .setApplication(this)
                //这里只需要选择设置一个
                .setRetSuccess(BuildConfig.CODE_SUCCESS)
//                .setRetSuccessList(BuildConfig.CODELIST_SUCCESS)
                .setBaseUrl(BuildConfig.BASE_URL)
                .setChangeBaseUrl(BuildConfig.OPEN_CHANGE)
                .setOpenLog(BuildConfig.OPEN_LOG)
                .addOkHttpInterceptor(new RequestHeaderInterceptor())//请求头拦截器
                .addOkHttpInterceptor(BuildConfig.OPEN_LOG, logging)//okhttp请求日志开关+消息拦截器.md
                .addRetCodeInterceptor(new SessionInterceptor())// returnCode非正常态拦截器
                .setGlidePlaceHolder(new ColorDrawable(Color.parseColor("#ffffff")))//默认占位图--颜色
                .setGlideHeaderPlaceHolder(getResources().getDrawable(R.mipmap.ic_launcher))//默认头像占位图
                .setRetrofit(appcomponent.getRetrofit())
                .build();
        appcomponent.inject(this);
        //application 上下文
        Utils.init(this);
        //Glide设置tag
        ViewTarget.setTagId(R.id.glide_tag);
        //log日子开关
        initLog();
        //ARouter
        initArouter();
    }

    private void initArouter() {
        //ARouter的初始化
        ARouter.init(this);
    }

    private void initLog() {
        //测试环境
        if (BuildConfig.OPEN_LOG) {
            ARouter.openLog();     // 打印日志
            ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
        }
    }

    //static 代码段可以防止内存泄露
    static {
        //启用矢量图兼容
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
        //设置全局的Header构建器
        SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() {
            @Override
            public RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) {
                layout.setPrimaryColorsId(R.color.colorPrimary, android.R.color.white);//全局设置主题颜色
                return new ClassicsHeader(context);//.setTimeFormat(new DynamicTimeFormat("更新于 %s"));//指定为经典Header,默认是 贝塞尔雷达Header
            }
        });
        //设置全局的Footer构建器
        SmartRefreshLayout.setDefaultRefreshFooterCreator(new DefaultRefreshFooterCreator() {
            @Override
            public RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) {
                //指定为经典Footer,默认是 BallPulseFooter
                return new ClassicsFooter(context).setDrawableSize(20);
            }
        });
    }

}


2.dagger2和mvp结合

app的build.gradle需引入相关dagger2库,-项目配置介绍中已配置,此部分内容自行参考

1.)BuilderModule的创建(所有的activity、fragment都要在这里进行注册)(⚠️注意:我在Demo里是放在了包名下面,我在项目开发中会使用到Template模版开发)

参考代码


@Module
public abstract class BuilderModule {
    //所有的activity、fragment都要在这里进行注册
    
}

2.)Appcomponent的创建

参考代码


@Singleton
@Component(modules = {AndroidSupportInjectionModule.class, ApiModule.class, BuilderModule.class})
public interface Appcomponent extends IAppComponent {

    //HulkUnionApplication是继承HulkApplication创建
    void inject(HulkUnionApplication mvpHulkApplication);

    Retrofit getRetrofit();

}

⚠️注意:DaggerAppComponent的生成make project一下就行

3.)以及注入初始化代码。 app级别的当然在application里面出初始化

参考代码

public class HulkUnionApplication extends HulkApplication {

    private static Appcomponent appcomponent;

    public static Appcomponent getAppcomponent() {
        return appcomponent;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        MultiDex.install(this);
    }

    @Override
    public void initHulkConfig() {
        //DaggerAppComponent的生成make project一下就行
        appcomponent = DaggerAppcomponent.builder().apiModule(new com.madreain.hulk.application.ApiModule()).build();
    }
}
    

3.配置相关的HulkConfig

1.)在config.gradle中配置开启日志、开启切换环境、BASEURL的相关参数

config.gradle的相关参数

参考代码

OPEN_LOG = true
OPEN_CHANGE = true
BASE_URL = " http://www.mxnzp.com"
CODE_SUCCESS = "1"
//增删改查返回网络请求成功,因为不支持集合,这里采用,分割
CODELIST_SUCCESS = "1,0"

⚠️注意:优先级:CODE_SUCCESS>CODELIST_SUCCESS,针对项目只需要设置其中一个就行

app的build.gradle中定义这三个参数,android下的defaultConfig

参考代码

//定义网络请求成功返回码 baseurl  日志打印  切换环境  在代码中Build
View on GitHub
GitHub Stars18
CategoryDevelopment
Updated2y ago
Forks5

Languages

Java

Security Score

80/100

Audited on Apr 26, 2023

No findings