优雅地处理加载中(loading),重试(retry)和无数据(empty)等

0
回复
135
查看
[复制链接]

1

主题

1

帖子

10

安币

初级码农

Rank: 1

发表于 2019-5-15 16:25:01 | 显示全部楼层 |阅读模式
如果对本篇文章感兴趣,请前往,原文地址:http://www.apkbus.com/blog-981890-80072.html

```LoadSir```是一个高效易用,低碳环保,扩展性良好的加载反馈页管理框架,在加载网络或其他数据时候,根据需求切换状态页面,可添加自定义状态页面,如加载中,加载失败,无数据,网络超时,占位图,登录失效等常用页面。可配合网络加载框架,结合返回状态码,错误码,数据进行状态页自动切换,封装使用效果更佳。## 效果预览|in Activity|in View|in Fragment|---|---|---||![图片描述](/data/attachment/album/201905/15/155644l8wg664p6w475g8g.gif)|![图片描述](/data/attachment/album/201905/15/155654eyko8mzyy47x7ksi.gif)|![图片描述](/data/attachment/album/201905/15/155657c544z6g92y62e4x9.gif)|Placeholder|Muitl-Fragment|ViewPage Fragment|---|---|---||![图片描述](/data/attachment/album/201905/15/155745jqyyyu31my33nnn0.gif)|![图片描述](/data/attachment/album/201905/15/155752czfcvvce6w225ses.gif)|![图片描述](/data/attachment/album/201905/15/155755hyv06s1zpvvp0hsn.gif)## 使用场景下面为大家常见的加载反馈页面:|loading|error|timeout|---|---|---||![图片描述](/data/attachment/album/201905/15/155904gcx488p9esj9x9pi.webp)|![图片描述](/data/attachment/album/201905/15/155909ffze28wz8b1itwbi.webp)|![图片描述](/data/attachment/album/201905/15/155917pppizrnjkw4mx4q8.webp)empty|        custom|        placeholder|---|---|---||![图片描述](/data/attachment/album/201905/15/155954h9gd65tkt5ga6tmo.webp)|![图片描述](/data/attachment/album/201905/15/155959d0k0ktsyfsmy8mmm.webp)|![图片描述](/data/attachment/album/201905/15/160003jzenpy2ita4jvvpp.webp)面对这么多状态页面,你是不是还在用include的方式,setVisibility(View.VISIBLE/GONE),这种方式即不方便控制,也造成了视图层级冗余(你要把所有状态布局include进一个视图)。如果有一种工具,能把这些事都做了就好了。恰好,  ```LoadSir``` 把这些事做了,接下来我们就来了解一下它。## LoadSir的功能及特点- 支持Activity,Fragment,Fragment(v4),View状态回调- 适配多个Fragment切换,及Fragment ViewPager切换,不会状态叠加或者状态错乱- 利用泛型转换输入信号和输出状态,可根据网络返回体的状态码或者数据返回自动适配状态页,实现全局自动状态切换- 只加载唯一一个状态视图,不会预加载全部视图- 可保留标题栏(Toolbar,titile view等)- 可设置重新加载点击事件(OnReloadListener)- 可自定义状态页(继承Callback类)- 可在子线程直接切换状态- 可设置初始状态页(常用进度页作为初始状态)- 不需要设置枚举或者常量状态值,直接用状态页类类型(xxx.class)作为状态码- 可扩展状态页面,在配置中添加自定义状态页- 可对单个状态页单独设置点击事件,根据返回boolean值覆盖或者结合OnReloadListener使用,如网络错误可跳转设置页- 可全局单例配置,也可以单独配置- 无预设页面,低耦合,开发者随心配置## 开始使用LoadSirLoadSir的使用只需要简单的三步,三步上篮的三步。#### 添加依赖```compile 'com.kingja.loadsir:loadsir:1.3.6'```## 第一步: 配置#### 全局配置方式全局配置方式,使用的是单例模式,即获取的配置都是一样的。可在Application中配置,添加状态页,设置初始化状态页,建议使用这种配置方式。```javapublic class App extends Application {    @Override    public void onCreate() {        super.onCreate();        LoadSir.beginBuilder()    .addCallback(new ErrorCallback())//'添加各种状态页    .addCallback(new EmptyCallback())    .addCallback(new LoadingCallback())    .addCallback(new TimeoutCallback())    .addCallback(new CustomCallback())    .setDefaultCallback(LoadingCallback.class)//设置默认状态页    .commit();    }}```#### 单独配置方式如果你即想保留全局配置,又想在某个特殊页面加点不同的配置,可采用该方式。```javaLoadSir loadSir = new LoadSir.Builder()    .addCallback(new LoadingCallback())    .addCallback(new EmptyCallback())    .addCallback(new ErrorCallback())    .build();        loadService = loadSir.register(this, new Callback.OnReloadListener() {@Overridepublic void onReload(View v) {    // 重新加载逻辑}        });```## 第二步: 注册#### 在Activity中使用```java@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_content);    // Your can change the callback on sub thread directly.    LoadService loadService = LoadSir.getDefault().register(this, new Callback.OnReloadListener() {        @Override        public void onReload(View v) {// 重新加载逻辑        }    });}}```#### 在View 中使用```javaImageView imageView = (ImageView) findViewById(R.id.iv_img);LoadSir loadSir = new LoadSir.Builder()        .addCallback(new TimeoutCallback())        .setDefaultCallback(LoadingCallback.class)        .build();loadService = loadSir.register(imageView, new Callback.OnReloadListener() {    @Override    public void onReload(View v) {        loadService.showCallback(LoadingCallback.class);        // 重新加载逻辑    }});```#### 在Fragment 中使用由于Fragment添加到Activitiy方式多样,比较特别,所以在Fragment中注册方式不同于上面两种,大家先看模板代码:```java@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle        savedInstanceState) {    //第一步:获取布局View    rootView = View.inflate(getActivity(), R.layout.fragment_a_content, null);    //第二步:注册布局View    LoadService loadService = LoadSir.getDefault().register(rootView, new Callback.OnReloadListener() {        @Override        public void onReload(View v) {// 重新加载逻辑        }    });    //第三步:返回LoadSir生成的LoadLayout    return loadService.getLoadLayout();}```## 第三步: 回调#### 直接回调```javaprotected void loadNet() {        // 进行网络访问...        // 进行回调        loadService.showSuccess();//成功回调        loadService.showCallback(EmptyCallback.class);//其他回调    }```#### 转换器回调 (推荐使用)如果你不想再每次回调都要手动进行的话,可以选择注册的时候加入转换器,可根据返回的数据,适配对应的回调。```javaLoadService loadService = LoadSir.getDefault().register(this, new Callback.OnReloadListener() {    @Override    public void onReload(View v) {// 重新加载逻辑    }}, new Convertor() {    @Override    public Class
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )