十分钟完成项目框架搭建

你还在新建项目时一个一个配置吗?今天有福利了,一行代码集成,简单配置后,就可以按照自己想要的任何开发框架开发了,比如MVP、MVVM、MVC、你自创的开发模式也可以...哈哈哈

先说集成方法:

第一步:参考最新github地址

compile 'com.bintray.library:common_library:1.0.1'

第二步:application中初始化,还有别忘了AndroidManifest中的配置,参考一中的4.2:

 //今日头条适配配置
        AutoSizeConfig.getInstance().getUnitsManager()
                .setSupportDP(false)
                .setSupportSP(false)
                .setSupportSubunits(Subunits.NONE);
        if (AppConstant.is_debug) {
            //开启InstantRun之后,一定要在ARouter.init之前调用openDebug
            ARouter.openDebug();
            ARouter.openLog();
        }
        //初始化ARouter
        ARouter.init(this);
        //common依赖库的相关初始化
        CommonLibConstant.init()
                .setAppContext(this)
                .setIsDebug(AppConstant.is_debug)
                .setNoNetWorkRemind("无网络")
                .setSharedPreferencesName("base_db")
                .setCrashSavePath(AppConstant.LOCAL_PATH)
                .setExternalNetworkIP();
        //网络请求初始化
        RetrofitClientUtil.initClient()
                .useCookiesInterceptor(new AddCookiesInterceptor(APPApplication.this))
                .setConnectionPoolNums(8)
                .setConnectionPoolKeepTime(15)
                .setRequestOutTime(20)
                .setRequestBaseUrl(AppConstant.base_url)//必须设置
                .build();//必须设置

第三步:如果你想使用butterknife找多个控件设置点击事件,可以参考下面代码配置,要是不需要就可以不添加下面代码(多模块可以将R改为R2使用)

1、//在项目的build.gradle中配置,由于依赖库也集成了butterknife,所以需要配置下,在需要用的页面自己进行注册
//此方法好像必须gradle版本4.4以上
classpath 'com.jakewharton:butterknife-gradle-plugin:9.0.0-rc3'
2、在应用模块的build.gradle中配置
apply plugin: 'com.jakewharton.butterknife'
annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc3'

好了这里就搭建完了,可以愉快的去开发了,建议自定义基础类集成依赖库中的类,方便你的后续公共处理。重要!重要!重要!

-----------------------------------------------------------------------以下主要是介绍-----------------------------------------------------------

下来我们看看这个基础库都包含了哪些东西:

1、基础Activity、Fragment的搭建等

2、网络请求框架(在retrofit基础上再次封装)

3、常用工具类的封装

好了,看看如何

一、基础Activity、Fragment的搭建等都具体有哪些呢?

1、使用了DataBinding,我只是简单实用DataBinding替代了findViewById功能:

2、使用阿里的ARouter进行跳转,关于使用方法直接参考https://github.com/alibaba/ARouter

3、建议自定义一个AppBaseActivity基础类,方便你做一些基础功能的配置:类似

public abstract class AppBaseActivity<T extends ViewDataBinding> extends BaseActivity<T> {

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

//若是不需要设置状态栏透明,此设置必须放置在super.onCreate之前处理

// isStatusBar = false;

super.onCreate(savedInstanceState);

}

}

4、项目使用的是今日头条的适配方案:https://github.com/JessYanCoding/AndroidAutoSize

4.1、在项目的Application初始化

//今日头条适配配置==不设置下面配置会出现在有些设配同比例放大,字体和宽都变得特别大

AutoSizeConfig.getInstance().getUnitsManager()

.setSupportDP(false)

.setSupportSP(false)

.setSupportSubunits(Subunits.NONE);

4.2、在AndroidManifest文件中的application标签中配置(两个值根据UI标注尺寸设置即可):

<meta-data

android:name="design_width_in_dp"

android:value="375" />

<meta-data

android:name="design_height_in_dp"

android:value="667" />

二、网络请求(以下包含很多伪代码,完整代码你可以参考文末的demo链接):

1、在项目的Application初始化:

//网络请求初始化

RetrofitClientUtil.initClient()

.useCookiesInterceptor(new AddCookiesInterceptor(APPApplication.this))

.setConnectionPoolNums(8)//连接池个数

.setConnectionPoolKeepTime(15)//连接池保活时间,单位秒

.setRequestOutTime(20)//设置超时时间 单位秒

.setRequestBaseUrl(AppConstant.base_url)//必须设置

.build();//必须设置

拦截器Interceptor可以参考AddCookiesInterceptor写一个属于自己项目的,因为请求头等没法写,所以这里建议仿照写自定义一个,让你仿照是因为这个拦截器做了请求处理,可以直接将请求链接、请求参数、请求结果清晰的打印出来,方便调试;

返回结果自定义处理类可以仿照ExampleRequestApiHelper示例类实现返回结果的处理:

/**
 * author : zyt
 * e-mail : 632105276@qq.com
 * date   : 2019/2/21
 * desc   :示例统一处理数据格式的类
 */

public abstract class ExampleRequestApiHelper extends RequestApiCallBack<JsonObject> {

    //这里可以更改为自己项目需要的加载提示Dialog
    private LoadingDialog loadingDialog;

    public ExampleRequestApiHelper() {
        super();
    }

    public ExampleRequestApiHelper(Context mContext) {
        super(mContext);
        initLoadingDialog();
    }

    @Override
    public void onStart() {
        super.onStart();

        //显示加载loading
        if (loadingDialog != null && !loadingDialog.isShowing()) {
            loadingDialog.showLoading();
        }
    }

    /**
     * 处理返回数据
     *
     * @param isSuccess 只有true正常处理
     * @param rootJson
     */
    protected abstract void dealSuccessData(boolean isSuccess, JSONObject rootJson);

    @Override
    public void onSuccess(JsonObject rootData) {
        //在这里设置取消dialog就可以
        dissmissLoadDialog();
        try {
            JSONObject rootJson = new JSONObject(rootData.toString());
            int code = rootJson.optInt("code", -1);
            switch (code) {
                case 0://成功
                    dealSuccessData(true, rootJson);
                    break;
                case 10000://失败
                    dealSuccessData(false, rootJson);
                    ToastUtils.getInstance().showToast(rootJson.optString("msg"));
                    break;
                case -1://未登录
                    if (mMContext != null) {

                    }
                    break;
                case 10001://失败状态 不弹出Toast
                    dealSuccessData(false, rootJson);
                    break;
                default:
                    dealSuccessData(false, rootJson);
                    ToastUtils.getInstance().showToast(rootJson.optString("msg"));
                    break;
            }
        } catch (JSONException e) {
            ToastUtils.getInstance().showToast("解析出错");
            e.printStackTrace();
          }

    }

    @Override
    public void onFail(Throwable e) {
        //在这里设置取消dialog就可以
        dissmissLoadDialog();
        ToastUtils.getInstance().showToast(e.getMessage());
    }

    /**
     * 初始化LoadingDialog
     */
    private void initLoadingDialog() {
        if (loadingDialog == null) {
            loadingDialog = new LoadingDialog(mMContext);
        }
    }

    /**
     * 关闭加载dialog
     */
    private void dissmissLoadDialog() {
        if (loadingDialog != null && loadingDialog.isShowing()) {
            loadingDialog.dismiss();
        }
    }
}

请求Presenter需要继承BasePresenter调用请求方法:

RequestParams requestParams = new RequestParams();

requestParams.addFormPart("type",4);

requestParams.addFormPart("status","1");

addSubscription(RetrofitClientUtil.initClient().create(MainModelApi.class).uploadUserTime(requestParams.create()),

new ExampleRequestApiHelper() {

@Override

protected void dealSuccessData(boolean isSuccess, JSONObject rootJson) {

mView.getDataSuccess(rootJson);

}

});

三、常用工具:

 

类名

功能

图片加载(glide库)

ImageUtil

支持正常加载、圆形图加载、圆角图加载、圆角和直角混合加载等;

页面缓存

ACacheDb

缓存数据的轻量级框架,用于缓存页面json数据,当没网络也可以显示数据

手机app缓存

CacheDataManager

获取手机app缓存

防止快速点击操作

FastClickUtils

防止快速点击操作,造成的多次触发

Toast工具类

ToastUtils

Toast提示,全局中间或者底部显示,多次吐司只替换内容

选择时间

WheelsUtils

时间滚轮选择器,支持选择当前时间以后或者以前的日期

日期工具类

DateUtils

跟日期相关的转化和获取等功能

图片压缩

ImageCompressUtil

使用和luban一样,我这里是拿取了luban的核心代码

状态栏相关

StatusNavBar

可以设置状态栏颜色、字体等修改

RecyclerView间距设置

RecyclerLinearDecoration针对LinearLayoutManager的间距,RecyclerGridDecoration针对GridLayoutManager的间距

项目常用方法

AppUtils

app的版本名、版本号、关闭键盘、显示键盘

Bitmap相关

BitMapUtils

更改bitmap的宽高、通过View获取Bitmap对象、两个图片的拼接、bitmap的各种转换、保存到相册并刷新等

权限相关

PermissionsUtils

验证必要权限、跳转应用信息页面、检测通知是否打开、在应用商店找到应用等

系统相关

SystemUtil

获取手机唯一标示(phone权限)、屏幕/当前页面亮度、设备IP、手机品牌、型号、系统版本等

SharedPreferences再封装

AppSharedPreHelper

SharedPreferences数据存储获取数据的封装

网络工具

NetworkUtil

是否有网络、网络状态、获取外网IP等

崩溃日志收集

CrashHandler

崩溃日志会保存在手机中,debug模式崩溃会直接以Activity显示崩溃的详细情况

 

需要注意点:

1、设置状态栏、导航栏:

StatusNavBar.with(this).statusBarColor(R.color.transparent)

.statusBarDarkFont(true).navigationBarColor(R.color.black_degree_50).init();

2、图片压缩直接参考:https://github.com/Curzibn/Luban 的使用方法

3、数据解析使用的是Gson封装

//解析数组数据方法:
 List<DataBean> dataList = GsonUtils.init().fromJsonArray("json数据", DataBean.class);
//解析数据对象方法:
 DataBean dataBean = GsonUtils.init().fromJsonObject("json数据", DataBean.class);

写之前感觉有很多东西要写,当开始写了发现很多东西都写不出来,需要看着项目去熟悉,文章只是为了帮助你理解的,最好还是去下载demo参考下,感觉好希望可以给一个star,谢谢了?;

项目Demo

参考项目:图片压缩 https://github.com/Curzibn/Luban

                 头条适配 https://github.com/JessYanCoding/AndroidAutoSize

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是搭建一个 Maven 的 Shiro 十分钟快速上手完整测试项目的步骤: 1. 创建 Maven 项目 首先,我们需要创建一个 Maven 项目。可以使用 Eclipse、IntelliJ IDEA 等 IDE,也可以使用 Maven 命令行创建。这里我使用 IntelliJ IDEA 创建 Maven 项目。 在 IntelliJ IDEA ,选择 File -> New -> Project,在弹出的窗口选择 Maven,然后点击 Next。 在 Create Maven Project 窗口,填写 GroupId、ArtifactId 和 Version,然后点击 Next。 接着,在 New Project 窗口,填写项目名称和项目路径,然后点击 Finish。 2. 添加 Shiro 依赖 在 pom.xml 文件添加 Shiro 依赖: ```xml <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.7.1</version> </dependency> ``` 3. 配置 Shiro 在 src/main/resources 目录下创建 shiro.ini 文件,配置 Shiro: ```ini [users] # 用户名 = 密码, 角色1, 角色2, ... admin = admin123, admin guest = guest123, guest [roles] # 角色名 = 权限1, 权限2, ... admin = * guest = user:read [urls] # URL = 过滤器1, 过滤器2, ... / = anon /login = anon /logout = logout /admin/** = authc, roles[admin] /user/** = authc, roles[guest] ``` 以上配置文件定义了两个用户 admin 和 guest,admin 拥有 admin 角色,guest 拥有 guest 角色。admin 角色拥有所有权限,guest 角色只有 user:read 权限。配置了一些 URL 的访问规则,例如 /admin/** 表示必须登录并且拥有 admin 角色才能访问。 4. 编写测试代码 在 src/test 目录下创建一个测试类,编写测试代码: ```java import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.config.IniSecurityManagerFactory; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.Factory; import org.junit.Test; public class ShiroTest { @Test public void testLogin() { // 读取 shiro.ini 配置文件,并创建 SecurityManager Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); // 获取当前用户 Subject currentUser = SecurityUtils.getSubject(); // 登录 UsernamePasswordToken token = new UsernamePasswordToken("admin", "admin123"); currentUser.login(token); // 判断是否登录成功 assert currentUser.isAuthenticated(); // 判断是否拥有 admin 角色 assert currentUser.hasRole("admin"); // 判断是否拥有 user:read 权限 assert currentUser.isPermitted("user:read"); // 退出登录 currentUser.logout(); // 判断是否退出成功 assert !currentUser.isAuthenticated(); } } ``` 以上测试代码首先读取 shiro.ini 配置文件,并创建 SecurityManager。然后获取当前用户,使用 admin 用户登录,判断登录是否成功,判断是否拥有 admin 角色和 user:read 权限,退出登录,判断是否退出成功。 5. 运行测试 在 IntelliJ IDEA ,可以直接运行测试类,或者使用 Maven 命令运行测试: ``` mvn test ``` 测试结果应该全部通过。 至此,一个 Maven 的 Shiro 十分钟快速上手完整测试项目搭建好了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值