Skip to content

详细使用介绍

胡伟 edited this page Feb 4, 2018 · 7 revisions

网络

简介:

网络算是项目的灵魂,基本每个项目都离不开网络,而一个简单好用,又支持各种配置的网络访问库就显得尤为重要了。该模块也是XSnow的核心功能,使用简单,支持定制常用配置,如各种拦截器、缓存策略、请求头等。

如果不进行二次封装,上层项目基于RxJava+Retrofit请求网络时需要每个接口都写一个服务接口,这样非常不便利。如何将响应结果通用处理就成为该模块的重点,项目中采用泛型转换方式,将响应结果ResponseBody通过map操作符转换成需要的T,具体实现参考项目中http包下的func包,如果需要Http响应码,也可以将响应结果包装成Response这样进行转换成T,考虑到项目中很少需要Http响应码来进行判定,一般使用服务器自定义的响应码就可以了,故该模块采用ResponseBody统一接收这种处理方式。

使用介绍

1、初始化

  • 简易初始化
ViseHttp.init(this);
ViseHttp.CONFIG()
        //配置请求主机地址
        .baseUrl("服务器地址");
  • 配置全局请求头
ViseHttp.CONFIG()
        .globalHeaders("全局请求头,HashMap组装");
  • 配置全局请求参数
ViseHttp.CONFIG()
        .globalParams("全局请求参数,HashMap组装");
  • 配置读取超时时间
ViseHttp.CONFIG()
        .readTimeout("全局读取超时时间,单位秒");
  • 配置写入超时时间
ViseHttp.CONFIG()
        .writeTimeout("全局写入超时时间,单位秒");
  • 配置连接超时时间
ViseHttp.CONFIG()
        .connectTimeout("全局连接超时时间,单位秒");
  • 配置请求失败重试次数
ViseHttp.CONFIG()
        .retryCount("全局请求失败重试次数");
  • 配置请求失败重试间隔时间
ViseHttp.CONFIG()
        .retryDelayMillis("全局请求失败重试间隔时间,单位毫秒");
  • 配置Cookie
ViseHttp.CONFIG()
        .setCookie(“需要使用cookie就设置为true”)
        .apiCookie(“设置自定义的Cookie管理对象”)
  • 配置OkHttp缓存
ViseHttp.CONFIG()
        .setHttpCache(“需要使用OkHttp缓存就设置为true”)
        .setHttpCacheDirectory(“设置OkHttp缓存路径”)
        .httpCache(“设置自定义OkHttp缓存”)
        .cacheOffline(“设置自定义离线缓存”)
        .cacheOnline(“设置自定义在线缓存”);
  • 配置应用级拦截器
ViseHttp.CONFIG()
        .interceptor("设置应用拦截器");
  • 配置网络拦截器
ViseHttp.CONFIG()
        .networkInterceptor("设置网络拦截器");
  • 配置证书验证
ViseHttp.CONFIG()
        .hostnameVerifier(“设置主机证书验证管理对象”)
        .SSLSocketFactory(“设置SSL证书验证管理对象”);
  • 示例
HashMap<String, String> globalHeaders = new HashMap<String, String>();
globalHeaders.put("User-Agent", getUserAgent(this));//用户代理
HashMap<String, String> globalParams = new HashMap<String, String>();
globalParams.put("appType", "Android");//app类型
globalParams.put("appId", "10001");//app标识
ViseHttp.init(this);
ViseHttp.CONFIG()
        //配置请求主机地址
        .baseUrl("http://192.168.1.100/")
        //配置全局请求头
        .globalHeaders(globalHeaders)
        //配置全局请求参数
        .globalParams(globalParams)
        //配置读取超时时间,单位秒
        .readTimeout(30)
        //配置写入超时时间,单位秒
        .writeTimeout(30)
        //配置连接超时时间,单位秒
        .connectTimeout(30)
        //配置请求失败重试次数
        .retryCount(3)
        //配置请求失败重试间隔时间,单位毫秒
        .retryDelayMillis(1000)
        //配置是否使用cookie
        .setCookie(true)
        //配置自定义cookie
        .apiCookie(new ApiCookie(this))
        //配置是否使用OkHttp的默认缓存
        .setHttpCache(true)
        //配置OkHttp缓存路径
        .setHttpCacheDirectory(new File(ViseHttp.getContext().getCacheDir(), ViseConfig.CACHE_HTTP_DIR))
        //配置自定义OkHttp缓存
        .httpCache(new Cache(new File(ViseHttp.getContext().getCacheDir(), ViseConfig.CACHE_HTTP_DIR), ViseConfig.CACHE_MAX_SIZE))
        //配置自定义离线缓存
        .cacheOffline(new Cache(new File(ViseHttp.getContext().getCacheDir(), ViseConfig.CACHE_HTTP_DIR), ViseConfig.CACHE_MAX_SIZE))
        //配置自定义在线缓存
        .cacheOnline(new Cache(new File(ViseHttp.getContext().getCacheDir(), ViseConfig.CACHE_HTTP_DIR), ViseConfig.CACHE_MAX_SIZE))
        //配置开启Gzip请求方式,需要服务器支持
        .postGzipInterceptor()
        //配置应用级拦截器
        .interceptor(new HttpLogInterceptor()
                .setLevel(HttpLogInterceptor.Level.BODY))
        //配置网络拦截器
        .networkInterceptor(new NoCacheInterceptor())
        //配置主机证书验证
        .hostnameVerifier(new SSLUtil.UnSafeHostnameVerifier("http://192.168.1.100/"))
        //配置SSL证书验证
        .SSLSocketFactory(SSLUtil.getSslSocketFactory(null, null, null));

2、一般GET请求

  • 基础调用
ViseHttp.GET("设置请求后缀,不能再包含主机地址")
        .tag("请求Tag,为防止内存泄露,必须设置,在onDestroy中调用cancelTag时使用")
        .request(new ACallback<AuthorModel>() {
            @Override
            public void onSuccess(AuthorModel authorModel) {
                //请求成功,AuthorModel为解析服务器返回数据的对象,可以是String,按需定义即可
            }

            @Override
            public void onFail(int errCode, String errMsg) {
                //请求失败,errCode为错误码,errMsg为错误描述
            }
});
  • 配置请求参数
.addParam("请求参数Key", "请求参数Value")//添加请求参数
.addParams(“请求参数集合,HashMap组装”)//添加请求参数集合
.params(“请求参数集合,HashMap组装”)//替换请求参数集合
.removeParam("请求参数Key")//移除单个请求参数
  • 配置请求头
.addHeader("请求头Key", "请求头Value")//添加请求头
.addHeaders(“请求头集合,HashMap组装”)//添加请求头集合
.headers(“请求头集合,HttpHeaders管理”)//替换请求头集合
.removeHeader("请求头Key")//移除单个请求头
  • 配置OkHttp缓存
.setHttpCache(“需要使用OkHttp缓存就设置为true”)
  • 配置本地缓存
.setLocalCache(“需要使用本地缓存就设置为true”)
.cacheKey("设置本地缓存Key")
.cacheTime(“设置本地缓存时间,单位毫秒,默认永久”)
.cacheMode(“设置本地缓存策略,有五种缓存策略”)
  • 配置应用和网络拦截器
.interceptor(“设置应用拦截器”)
.networkInterceptor(“设置网络拦截器”)
  • 配置失败重试机制
.retryCount(“设置失败重试次数”)
.retryDelayMillis(“设置失败重试间隔时间,单位毫秒”)
  • 配置读写以及连接超时时间
.readTimeOut(“设置读取超时时间,单位秒”)
.writeTimeOut(“设置写入超时时间,单位秒”)
.connectTimeOut(“设置读取超时时间,单位秒”)
  • 配置主机地址
.baseUrl("设置针对该请求的主机地址")
  • 请求示例

GET 不带缓存

ViseHttp.GET("getAuthor").request(new ACallback<AuthorModel>() {
    @Override
    public void onSuccess(AuthorModel authorModel) {
    }

    @Override
    public void onFail(int errCode, String errMsg) {
    }
});

GET 带缓存

ViseHttp.GET("getAuthor")
        .setLocalCache(true)//设置是否使用缓存,如果使用缓存必须设置为true
        .cacheMode(CacheMode.FIRST_CACHE) //配置缓存策略
        .request(new ACallback<CacheResult<AuthorModel>>() {
            @Override
            public void onSuccess(CacheResult<AuthorModel> cacheResult) {
            }

            @Override
            public void onFail(int errCode, String errMsg) {
            }
        });

由于带缓存方式有点不一样,需要告知上层是否是缓存数据,所以需要外部包裹一层CacheResult结构,使用时必须要按照这种方式设置model,还有需要注意的是必须要设置缓存开关为true,如果为false是没法解析CacheResult结构的,这点一定切记。

GET 返回String

ViseHttp.GET("getString").request(new ACallback<String>() {
    @Override
    public void onSuccess(String data) {
    }

    @Override
    public void onFail(int errCode, String errMsg) {
    }
});

GET 返回List

ViseHttp.GET("getListAuthor").request(new ACallback<List<AuthorModel>>() {
    @Override
    public void onSuccess(List<AuthorModel> authorModel) {
    }

    @Override
    public void onFail(int errCode, String errMsg) {
    }
});

以上为Get请求的使用介绍,相关配置上面已详细解释,可按需设置即可。

3、一般POST请求

  • 基础调用
ViseHttp.POST("设置请求后缀,不能再包含主机地址")
        .tag("请求Tag,为防止内存泄露,必须设置,在onDestroy中调用cancelTag时使用")
        .request(new ACallback<String>() {
            @Override
            public void onSuccess(String data) {
                //请求成功
            }

            @Override
            public void onFail(int errCode, String errMsg) {
                //请求失败,errCode为错误码,errMsg为错误描述
            }
});
  • 配置请求参数
.addParam("请求参数Key", "请求参数Value")//添加请求参数
.addParams(“请求参数集合,HashMap组装”)//添加请求参数集合
.params(“请求参数集合,HashMap组装”)//替换请求参数集合
.removeParam("请求参数Key")//移除单个请求参数
  • 配置请求头
.addHeader("请求头Key", "请求头Value")//添加请求头
.addHeaders(“请求头集合,HashMap组装”)//添加请求头集合
.headers(“请求头集合,HttpHeaders管理”)//替换请求头集合
.removeHeader("请求头Key")//移除单个请求头
  • 配置应用和网络拦截器
.interceptor(“设置应用拦截器”)
.networkInterceptor(“设置网络拦截器”)
  • 配置失败重试机制
.retryCount(“设置失败重试次数”)
.retryDelayMillis(“设置失败重试间隔时间,单位毫秒”)
  • 配置读写以及连接超时时间
.readTimeOut(“设置读取超时时间,单位秒”)
.writeTimeOut(“设置写入超时时间,单位秒”)
.connectTimeOut(“设置读取超时时间,单位秒”)
  • 配置主机地址
.baseUrl("设置针对该请求的主机地址")
  • 配置上传的表单
.addForm("请求表单Key", "请求表单Value")
  • 配置上传的Json
.setJson("设置上传的Json格式数据,可以先用对象组装,再用Gson进行转换")
  • 配置上传的字符串
.setString("设置上传的字符串")
  • 配置上传的RequestBody
.setRequestBody(“设置上传自定义的RequestBody对象”)
  • 配置请求链接后带参数
.addUrlParam("请求参数Key", "请求参数Value")

这个是为了满足有些POST请求可能URL后面也带有参数的场景。

  • 请求示例

POST 普通请求

ViseHttp.POST("postAuthor").request(new ACallback<String>() {
    @Override
    public void onSuccess(String data) {
    }

    @Override
    public void onFail(int errCode, String errMsg) {
    }
});

POST 上传表单

ViseHttp.POST("postFormAuthor")
        .addForm("author_name", getString(R.string.author_name))
        .addForm("author_nickname", getString(R.string.author_nickname))
        .addForm("author_account", "xiaoyaoyou1212")
        .addForm("author_github", "https://github.com/xiaoyaoyou1212")
        .addForm("author_csdn", "http://blog.csdn.net/xiaoyaoyou1212")
        .addForm("author_websit", "http://www.huwei.tech/")
        .addForm("author_introduction", getString(R.string.author_introduction))
        .request(new ACallback<String>() {
            @Override
            public void onSuccess(String data) {
            }

            @Override
            public void onFail(int errCode, String errMsg) {
            }
        });

上传表单时需要通过addForm将键值对一个个添加进去,支持上传中文字符。

POST 上传json

AuthorModel mAuthorModel = new AuthorModel();
mAuthorModel.setAuthor_id(1008);
mAuthorModel.setAuthor_name(getString(R.string.author_name));
mAuthorModel.setAuthor_nickname(getString(R.string.author_nickname));
mAuthorModel.setAuthor_account("xiaoyaoyou1212");
mAuthorModel.setAuthor_github("https://github.com/xiaoyaoyou1212");
mAuthorModel.setAuthor_csdn("http://blog.csdn.net/xiaoyaoyou1212");
mAuthorModel.setAuthor_websit("http://www.huwei.tech/");
mAuthorModel.setAuthor_introduction(getString(R.string.author_introduction));
ViseHttp.POST("postJsonAuthor")
        .setJson(GSONUtil.gson().toJson(mAuthorModel))
        .request(new ACallback<String>() {
            @Override
            public void onSuccess(String data) {
            }

            @Override
            public void onFail(int errCode, String errMsg) {
            }
        });

上传JSON格式数据时需要先将数据转换成JSON格式,再通过setJson添加进去。

POST 后缀带请求参数

ViseHttp.POST("postUrlAuthor")
        .addUrlParam("appId", "10001")
        .addUrlParam("appType", "Android")
        .setJson(GSONUtil.gson().toJson(mAuthorModel))
        .request(new ACallback<String>() {
            @Override
            public void onSuccess(String data) {
            }

            @Override
            public void onFail(int errCode, String errMsg) {
            }
        });

有些POST请求可能URL后面也带有参数,这样的话需要通过addUrlParam进行设置,与添加到请求body的参数设置方式addParam是不一样的,这点需要注意。

4、自定义Retrofit请求

这个是为了兼容部分请求已经创建了Retrofit接口类的情况,使用前请先确认是否一定需要这样使用。

  • 请求示例

不带缓存方式

ViseHttp.RETROFIT()
        .create(AuthorService.class)
        .getAuthor()
        .compose(ApiTransformer.<AuthorModel>norTransformer())
        .subscribe(new ApiCallbackSubscriber<>(new ACallback<AuthorModel>() {
            @Override
            public void onSuccess(AuthorModel authorModel) {
                ViseLog.i("request onSuccess!");
                if (authorModel == null) {
                    return;
                }
                mShow_response_data.setText(authorModel.toString());
            }

            @Override
            public void onFail(int errCode, String errMsg) {
                ViseLog.e("request errorCode:" + errCode + ",errorMsg:" + errMsg);
            }
        }));

带缓存方式

ViseHttp.RETROFIT()
        .create(AuthorService.class)
        .getAuthor()
        .compose(ApiTransformer.<AuthorModel>norTransformer())
        .compose(ViseHttp.getApiCache().<AuthorModel>transformer(CacheMode.CACHE_AND_REMOTE, AuthorModel.class))
        .subscribe(new ApiCallbackSubscriber<>(new ACallback<CacheResult<AuthorModel>>() {
            @Override
            public void onSuccess(CacheResult<AuthorModel> cacheResult) {
                ViseLog.i("request onSuccess!");
                if (cacheResult == null || cacheResult.getCacheData() == null) {
                    return;
                }
                if (cacheResult.isCache()) {
                    mShow_response_data.setText("From Cache:\n" + cacheResult.getCacheData().toString());
                } else {
                    mShow_response_data.setText("From Remote:\n" + cacheResult.getCacheData().toString());
                }
            }

            @Override
            public void onFail(int errCode, String errMsg) {
                ViseLog.e("request errorCode:" + errCode + ",errorMsg:" + errMsg);
            }
        }));

上面所述的请求方式可以满足大部分的请求场景,如果没有什么特殊要求按照上述描述使用即可。 以下两种请求方式是处理返回结构通用的情况,使用前请先确认返回结构一定是ApiResult结构,还有由于ApiResult这个结构没法通用,用的是拓展库方式提供一种解决方案,如果服务器定义的字段不同需要替换成各自服务器定义的字段,具体参考netexpand库,使用前需要将相关代码拷贝到工程中去,这里调用请求需要通过BASE方式将自定义的请求方式设置进去,内部会自动去掉外部层级ApiResult,直接返回你所需的数据部分。

5、带ApiResult结构GET请求

相关配置描述参考一般GET请求。

  • 使用示例
ViseHttp.BASE(new ApiGetRequest("getApiResultAuthor")).request(new ACallback<AuthorModel>() {
    @Override
    public void onSuccess(AuthorModel authorModel) {
    }

    @Override
    public void onFail(int errCode, String errMsg) {
    }
});

6、带ApiResult结构POST请求

相关配置描述参考一般POST请求。

  • 使用示例
ViseHttp.BASE(new ApiPostRequest("postApiResultAuthor")).request(new ACallback<AuthorModel>() {
    @Override
    public void onSuccess(AuthorModel authorModel) {
    }

    @Override
    public void onFail(int errCode, String errMsg) {
    }
});

上传下载

该库支持简单的文件上传下载功能,可以满足单线程模式下的文件上传下载需求,由于上传下载功能需要用到网络相关,所以也需要像使用网络请求那样进行初始化和添加相关配置。

  • 上传基础调用
ViseHttp.UPLOAD("设置上传地址后缀,不能再包含主机地址", "设置上传进度回调")
        .tag("请求Tag,为防止内存泄露,必须设置,在onDestroy中调用cancelTag时使用")
        .request(new ACallback<Object>() {
            @Override
            public void onSuccess(Object data) {
                //请求成功
            }

            @Override
            public void onFail(int errCode, String errMsg) {
                //请求失败,errCode为错误码,errMsg为错误描述
            }
});
  • 下载基础调用
ViseHttp.DOWNLOAD("设置下载地址后缀,不能再包含主机地址")
        .setRootName("设置下载根目录,默认App包目录下的缓存目录")
        .setDirName("设置下载文件夹名称,默认download")
        .setFileName(“设置下载文件名称”)
        .request(new ACallback<DownProgress>() {
            @Override
            public void onSuccess(DownProgress downProgress) {
                //下载进度回调
            }

            @Override
            public void onFail(int errCode, String errMsg) {
                //下载失败
            }
        });
  • 配置请求参数
.addParam("请求参数Key", "请求参数Value")//添加请求参数
.addParams(“请求参数集合,HashMap组装”)//添加请求参数集合
.params(“请求参数集合,HashMap组装”)//替换请求参数集合
.removeParam("请求参数Key")//移除单个请求参数
  • 配置请求头
.addHeader("请求头Key", "请求头Value")//添加请求头
.addHeaders(“请求头集合,HashMap组装”)//添加请求头集合
.headers(“请求头集合,HttpHeaders管理”)//替换请求头集合
.removeHeader("请求头Key")//移除单个请求头
  • 配置应用和网络拦截器
.interceptor(“设置应用拦截器”)
.networkInterceptor(“设置网络拦截器”)
  • 配置失败重试机制
.retryCount(“设置失败重试次数”)
.retryDelayMillis(“设置失败重试间隔时间,单位毫秒”)
  • 配置读写以及连接超时时间
.readTimeOut(“设置读取超时时间,单位秒”)
.writeTimeOut(“设置写入超时时间,单位秒”)
.connectTimeOut(“设置读取超时时间,单位秒”)
  • 配置主机地址
.baseUrl("设置针对该请求的主机地址")
  • 配置请求链接后带参数
.addUrlParam("请求参数Key", "请求参数Value")

这个是为了满足有些POST请求可能URL后面也带有参数的场景。

  • 配置上传的文件
.addFile("设置上传文件的Key", "设置上传的文件", "设置上传文件的回调,可不设置")
.addFiles(“设置上传多个文件的集合,HashMap组装”)
  • 配置上传的图片
.addImageFile("设置上传图片的Key", “设置上传的图片”, “设置上传图片的回调,可不设置”)
  • 配置上传的字节数组
.addBytes("设置上传字节数组的Key", “设置上传的字节数组”, "设置生成的文件名称", “设置上传字节数组的回调,可不设置”)
  • 配置上传的流
.addStream("设置上传流的Key", “设置上传的流”, “设置生成的文件名称”, “设置上传流的回调,可不设置”)

使用示例:

  • 上传示例:
ViseHttp.UPLOAD("addImageFile", new UCallback() {
    @Override
    public void onProgress(long currentLength, long totalLength, float percent) {
    }

    @Override
    public void onFail(int errCode, String errMsg) {
    }}).addFile("androidIcon", getUploadFile(mContext, "test.jpg"))
        .baseUrl("https://200.200.200.50/")
        .request(new ACallback<Object>() {
    @Override
    public void onSuccess(Object data) {
    }

    @Override
    public void onFail(int errCode, String errMsg) {
    }
});

由于API请求成功与上传回调没法统一处理,故将请求成功与上传进度回调分离,上传进度通过UCallback告知调用者,上传进度支持拦截器返回,也支持添加文件上传时设置回调。

  • 下载示例:
ViseHttp.DOWNLOAD("weixin/android/weixin6330android920.apk")
        .baseUrl("http://dldir1.qq.com/")
        .setFileName(saveName)
        .request(new ACallback<DownProgress>() {
            @Override
            public void onSuccess(DownProgress downProgress) {
            }

            @Override
            public void onFail(int errCode, String errMsg) {
            }
        });

通过读取返回的DownProgress获取下载进度,下载文件默认保存在该应用的/cache/download目录下。

缓存

简介:

包含内存、磁盘二级缓存以及SharedPreferences缓存,可自由拓展。磁盘缓存支持KEY加密存储,可定制缓存时长。SharedPreferences支持内容安全存储,采用Base64加密解密。

使用示例:

  • 内存存储:MemoryCache.getInstance().put("authorInfo", mAuthorModel);

  • 内存获取:MemoryCache.getInstance().get("authorInfo");

  • 磁盘缓存存储:diskCache.put("authorInfo", mAuthorModel);

  • 磁盘缓存获取:diskCache.get("authorInfo");

  • SharedPreferences缓存存储:spCache.put("authorInfo", mAuthorModel);

  • SharedPreferences缓存获取:spCache.get("authorInfo");

事件总线

简介:

采用Rx响应式编程思想建立的RxBus模块,采用注解方式标识事件消耗地,通过遍历查找事件处理方法。支持可插拔,可替换成EventBus库,只需上层采用的同样是注解方式,那么上层是不需要动任何代码的。

使用示例:

  • 发送事件:BusManager.getBus().post(new AuthorEvent().setAuthorModel(mAuthorModel));

  • 注册事件:BusManager.getBus().register(this);

  • 取消注册:BusManager.getBus().unregister(this);

  • 接收事件:

@EventSubscribe
public void showAuthor(IEvent event) {
    if (event != null && event instanceof AuthorEvent) {
        ViseLog.i("Receive Event Message:" + ((AuthorEvent) event).getAuthorModel());
    }
}

如果需要定制使用其他Bus如EventBus,那么只需将实现IBus接口的对象在应用初始化时通过BusManager.setBus(new EventBus())传进去即可。

数据库

简介:

采用greenDao数据库,其优势就不多说了,网上有解释,其主要优点就是性能高。该模块定制数据库操作接口,有统一的实现类DBManager,上层只需实现getAbstractDao()方法告知底层DaoSession,增删改查操作不需要关心具体细节,调用DBManager中的方法就行。

使用示例:

  • 配置:需要通过gradle添加greendao的相关插件配置,还有需要在当前应用module中的android配置下添加如下配置信息,具体可以参考demo的示例
greendao{
    schemaVersion 1	//数据库版本
    targetGenDir 'src/main/java'	//包目录所在文件夹
    daoPackage 'com.vise.snowdemo.db'	//存放数据库相关的包目录
}
  • 初始化:在application中进行如下初始化操作:DbHelper.getInstance().init(this);

  • 增:DbHelper.getInstance().author().insert(mAuthorModel);

  • 删:DbHelper.getInstance().author().delete(mAuthorModel);

  • 改:DbHelper.getInstance().author().update(mAuthorModel);

  • 查:DbHelper.getInstance().author().loadAll()

图片加载

简介:

采用Glide库进行图片加载,支持轻量级图片加载,该模块支持可插拔,可根据需求替换成任意图片加载库,如果项目中对于图片处理要求比较高,那么可以替换成Facebook提供的Fresco库。

使用示例:

  • 初始化:在application中进行如下初始化操作:LoaderFactory.getLoader().init(this);

  • 调用过程:

LoaderFactory.getLoader().loadNet(imageView, url, new ILoader.Options(R.mipmap.github_head_portrait, R.mipmap.github_head_portrait));

如果需要定制使用其他图片加载框架如Fresco,那么只需将实现ILoader接口的对象在应用初始化时通过LoaderFactory.setLoader(new FrescoLoader())传进去即可。

权限管理

简介:

由于Android6.0以上系统对于权限管理更严格,安全性也有很大的提高,但是随之带来的就是权限管理的代码编写更麻烦,如在权限被用户拒绝时该怎么提示,或者在用户勾选永远拒绝下该怎么处理。针对此种情况,该模块尽量以最小的调用完成权限的管理,只需要一行代码就搞定权限的申请过程,并返回所有需要的回调结果。

使用示例:

//具体使用效果请查看demo
PermissionManager.instance().with(this).request(new OnPermissionCallback() {
    @Override
    public void onRequestAllow(String permissionName) {
        DialogUtil.showTips(mContext, getString(R.string.permission_control),
                getString(R.string.permission_allow) + "\n" + permissionName);
    }

    @Override
    public void onRequestRefuse(String permissionName) {
        DialogUtil.showTips(mContext, getString(R.string.permission_control),
                getString(R.string.permission_refuse) + "\n" + permissionName);
    }

    @Override
    public void onRequestNoAsk(String permissionName) {
        DialogUtil.showTips(mContext, getString(R.string.permission_control),
                getString(R.string.permission_noAsk) + "\n" + permissionName);
    }
}, Manifest.permission.CALL_PHONE);